AWAITで減少を使用して、さまざまな結果が得られます -- javascript フィールド と html フィールド と algorithm フィールド と async-await フィールド と reduce フィールド 関連 問題

Using reduce with await give different result












0
vote

問題

日本語

ASYNC関数と同様の引数が異なる場合は、ASYNC関数と非同期のないものが1つあります。結果が異なる場合は、なぜ把握できません。

非同期なしの例:

 <コード> function output(inp) {      document.body.appendChild(document.createElement('pre')).innerHTML = inp;  }    const listOfMonths = [    "2020-01",    "2020-02",    "2020-03",    "2020-04",    "2020-05",    "2020-06"  ];    const reduceWithoutAsync = listOfMonths.reduce(          (previousKpis, curr, index) => {            return {              ...previousKpis,              [curr]: "Hello Mars"            };          },          {}        );          output(JSON.stringify(reduceWithoutAsync, null, 4))  

非同期:

 <コード> function output(inp) {      document.body.appendChild(document.createElement('pre')).innerHTML = inp;  }    const listOfMonths = [    "2020-01",    "2020-02",    "2020-03",    "2020-04",    "2020-05",    "2020-06"  ];    listOfMonths.reduce(async (previousKpis, curr, index) => {    return Promise.resolve({             ...previousKpis,             [curr]: await Promise.resolve("hello Mars")           });      },    Promise.resolve({})  ).then(result => output(JSON.stringify(result, null, 4)));          

私が非同期を使ったときに最後の要素を持っているのはなぜですか?

英語

I have one reduce with async function and another one without async, given the same arguments the result is different, I can't figure out why:

Example without async:

function output(inp) {      document.body.appendChild(document.createElement('pre')).innerHTML = inp;  }    const listOfMonths = [    "2020-01",    "2020-02",    "2020-03",    "2020-04",    "2020-05",    "2020-06"  ];    const reduceWithoutAsync = listOfMonths.reduce(          (previousKpis, curr, index) => {            return {              ...previousKpis,              [curr]: "Hello Mars"            };          },          {}        );          output(JSON.stringify(reduceWithoutAsync, null, 4))

With Async:

function output(inp) {      document.body.appendChild(document.createElement('pre')).innerHTML = inp;  }    const listOfMonths = [    "2020-01",    "2020-02",    "2020-03",    "2020-04",    "2020-05",    "2020-06"  ];    listOfMonths.reduce(async (previousKpis, curr, index) => {    return Promise.resolve({             ...previousKpis,             [curr]: await Promise.resolve("hello Mars")           });      },    Promise.resolve({})  ).then(result => output(JSON.stringify(result, null, 4)));        

Why I'm only having the last element when I use the async?

</div
              

回答リスト

1
 
vote
vote
ベストアンサー
 

 <コード> function output(inp) {      document.body.appendChild(document.createElement('pre')).innerHTML = inp;  }    const listOfMonths = [    "2020-01",    "2020-02",    "2020-03",    "2020-04",    "2020-05",    "2020-06"  ];    listOfMonths.reduce((previousKpis, curr, index) => (          previousKpis.then(async prev => ({              ...prev,              [curr]: await Promise.resolve("hello Mars")          }))      ),      Promise.resolve({})  ).then(result => output(JSON.stringify(result, null, 4)));          

PreviousKpisは約束ですので、私の例で行ったように<コード> await を使用するか、 then を使用する必要があります。すべてが大丈夫なはずです!

 

function output(inp) {      document.body.appendChild(document.createElement('pre')).innerHTML = inp;  }    const listOfMonths = [    "2020-01",    "2020-02",    "2020-03",    "2020-04",    "2020-05",    "2020-06"  ];    listOfMonths.reduce((previousKpis, curr, index) => (          previousKpis.then(async prev => ({              ...prev,              [curr]: await Promise.resolve("hello Mars")          }))      ),      Promise.resolve({})  ).then(result => output(JSON.stringify(result, null, 4)));        

previousKpis is a Promise, so you need to either await it or use then as I did in my example. Everything should be fine then!

</div
 
 
0
 
vote

const previousKpis = await previousKpis

縮小する各機能は、約束を返すことを意味する非同期機能です。あなたがその約束に戻って電話をかけているにもかかわらず、あなたはそれを待つ必要があります。あなたはそれが解決する前にprefordkpisを広めています、私は信じています。

 

Add const previousKpis = await previousKpis before your return statement.

Each function you provide to reduce is an async function which means it returns a promise. Even though you are calling return in that promise, you still need to await it. You are spreading previousKpis before it resolves, I believe.

</div
 
 
 
 

関連する質問

10  Java 8でのHaskellのFOUMPR【重複】  ( Haskells foldr equivalent in java 8 ) 
この質問はすでにここで回答を持っています Lambda式を使用して指定されたリストを減らす方法.Reduce( )方法 (2回答) ...

2  Hadoop - 減量段階の重さ  ( Hadoop weight of reduce stages ) 
Hadoop 1.0.1では、APIを使用して軽減タスクで各段階の重量を見つけることができますか? それ以上の明示的な、私は、シャッフリング段階、順序付けフェーズ、および併合フェーズによってどのくらいの減少したタスクがどれだけ見ているかを見ようとしています...

-3  アレイグループと縮小 - JavaScript [閉じる]  ( Array group and reduce javascript ) 
閉鎖。この質問はもっと焦点を絞ったにする必要があります。現在答えを受け付けていません。 この質問を改善したいですか?このPOST...

0  iPhoneアプリメモリを減らすために "スプライト"を作成します  ( Create sprites to reduce iphone app memory ) 
現在私のiPhoneアプリはすべてのアイコンとボタンを.pngイメージとしてロードします。これは非常に多くのメモリを取ります。 My Appが使用するメモリの量が大幅に減少するように、複数の画像をロードする方法や複数の画像をロードする方法がありますか? 画像の...

0  Android XMLコードを短くして暗号化します  ( Android shorten and encrypt xml code ) 
ユーザーが望む場合、アプリはアプリが持っているデータからXMLコードを出力できます。 例えば: <事前> <コード> <Week> <Monday>I went to the cinema</Monday> ... </Week> このXMLコード...

19  JavaScript Array Refecing()メソッドを使用するための本当の利点はありますか?  ( Is there any real benefit for using javascript array reduce method ) 
reduce()メソッドのほとんどの使用例は、FORループで簡単に書き換えることができます。そして、require()がreduce()であることは、各反復内で実行された操作に応じて、reduce()が遅くなることを示しています。 「機能スタイル」でコードを...

24  Rubyの2つの配列からの値のマッピング値  ( Mapping values from two array in ruby ) 
RubyのPythonで、私が下記のことをできることをする方法があるかどうか疑問に思う: <事前> <コード> sum = reduce(lambda x, y: x + y, map(lambda x, y: x * y, weights, data)) ...

0  MapReduce WordCountプログラムでドライバによって呼び出されません  ( Reducer not called by driver in mapreduce wordcount program ) 
<事前> <コード> package com.delhi; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; import or...

43  機能を軽減するにはどうすればいいですか?  ( How does reduce function work ) 
私が理解している限り、reduce関数はリスト<コード> l と関数 f を取ります。その後、リストの最初の2つの要素で関数 f を呼び出してから、次のリスト要素と前の結果を使用して関数 f を繰り返し呼び出します。 だから、私は以下の機能を定義します: 次...

4  実際の(非整数)係数を持つ多項式の誤差で結果を減らす  ( Reduce results in an error for a polynomial with real non integer coefficients ) 
Mathematicaでは、多項式の条件を確認しようとしました。そのパラメータは範囲内で変わります。私の計算は5次のものですが、私は私のニーズを見せるために単純なものを作りました。 整数をパラメータとして持つ多項式を作成するときは、<コード> Reduce ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有