1

次のコードJavaScriptの非同期/ Array.map(内部約定の待ち)

class SomeClass { 
    async someFunc() { 
    const urlParameters = [0, 1, 2]; 
    const batchAjaxResult = await urlParameters.map((parameter) => { 
     const result = await $.get(`someUrl/${parameter}`); 
     return { 
      parameter, 
      result 
     } 
    }); 

    console.log(batchAjaxResult); 

    } 
} 

を考えるJavaScriptが代わりに実際の約束結果の解決約束の配列を返します。

これはおそらくArray.map()がプロミスとして実装されていないためです。

PromiseベースのバージョンArray.mapはありますか?

これはArray.mapの中にラップされたバッチ応答を返す方法であるため、How to return the response from an asynchronous callとは異なる質問です。

+0

具体的に[この回答](http://stackoverflow.com/a/30180679/542251)私はすでに述べたES7を使用してい – Liam

+1

@Liam非同期/のawait構文の底部に向かって見て。この問題はArray.mapを使用している場合にのみ発生します。 'const X = Array.map(...)はまだ実装されていないようです。 –

+2

配列ではなく約束を 'await'するだけです。 'Promise.all(配列)'を待ちます。 – jib

答えて

1

この質問を書くことで、私は問題の根底に到達することができました。

ブルーバードは、このような機能があると似てPromise.map

と呼ばれているようネイティブ実装は、「バルク約束」

を作成Promise.allと呼ばれ、次のように私は、コードを変更し、それが働いているようだ:

class SomeClass { 
    async someFunc() { 
     const urlParameters = [0, 1, 2]; 
     const batchAjaxResult = await Promise.all(
      urlParameters.map(async (parameter) => { 
      const result = await $.get(`someUrl/${parameter}`); 
      return { 
       parameter, 
       result 
      } 
     }) 
    ); 
     console.log(batchAjaxResult); 

    } 
} 
+2

arrow関数自体も非同期でなければなりません。 –

+0

"それは動作しています" ---構文エラーがあるため、間違いなくです。 – zerkms

+0

申し訳ありませんが、矢印機能は非同期である必要があります。私はコード –

3

この簡単な機能を使用して、連続実行を約束することができます。

function asyncMap(arr, mapper) { 
 
    var q = Promise.resolve(); 
 
    return Promise.all(arr.map(v => q = q.then(() => mapper(v)))); 
 
} 
 

 

 
// Usage 
 

 
asyncMap([1, 2, 3], v => { 
 
    return new Promise(resolve => { 
 
    console.log("Start " + v); 
 
    setTimeout(() => { 
 
     console.log("End " + v); 
 
     resolve("foo" + v); 
 
    }, 500); 
 
    }); 
 
}).then(a => console.log(a));

+0

はいを​​修正しましたが、私は並列実行を探していました。ブラウザにデータを1つずつUIに読み込ませたくない場合。 –

+0

@TobiasMühlさて、質問そのものの中で、これらの種類のことを言及するのが最善です。 –