2017-02-11 6 views
0

forループ内で解決するPromiseを含む関数foo()があります。私はfoo()を数回実行して、毎回異なる引数を与えたい。それから、私はそのすべての結果で何かをしたい。 Promise.all()はforループの最後で実行されるか、またはfoo()内部のすべての約束が返された後で実行されますか?あるいは、「これらのfoo()のどれもが約束ではない」と言うでしょうか?そして私を笑う?forループで作成したPromisesの後にPromise.all()を使用する方法

var foo = (x) => { 
    for (var i = 0; i < 100; i++) { 
     someOtherFunctionThatReturnsAPromise(x).then(returnSomething()); 
    } 
}; 

function nowDoEverything() { 
    return Promise.all([foo(1), foo(2), foo(3)]).then(doSomethingWithAllThoseReturnedValues()); 
} 

nowDoEverything(); 

プロミスを返す必要はありますか?もしそうなら、私はfoo()内部の約束事がforループの内部で生成されるので、どうすればよいのでしょうか?

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/allは は「Promise.all(反復可能)メソッドは、反復可能な引数での約束がすべて解決されていたときに解決する約束を返す、または拒否する最初に渡さ約束の理由で拒否します。」と述べています

このビデオhttps://www.youtube.com/watch?v=RRgAdi3gX-sは基本的な約束を説明するのに本当に良いですが、私は建築家が意図していない/期待していることをしようとしているようです。

答えて

2

プッシュ約束を配列に、return配列をfooから、すぐに関数を呼び出す避けるために.then()内の関数から()を省略します。 foo()呼び出しでspread要素を使用して、にチェーンされた.then()への約束の単一の配列を返します。

var foo = (x) => { 
    var arr = []; 
    for (var i = 0; i < 100; i++) { 
     arr.push(someOtherFunctionThatReturnsAPromise(x).then(returnSomething)); 
    } 
    return arr 
}; 

function nowDoEverything() { 
    return Promise.all([...foo(1), ...foo(2), ...foo(3)]) 
      .then(doSomethingWithAllThoseReturnedValues) 
} 

nowDoEverything() 
.catch(err => console.log(err)); 
+0

よかった、ありがとう!省略記号(... foo(1))とは何ですか? –

+1

@GlenPierce '...'句読点は、用途に応じて要素を広げたり、残りの要素にすることができます。[ECMAScriptのドキュメントのSpreadElementとは? MDNのSpread演算子と同じですか?](http://stackoverflow.com/questions/37151966/what-is-spreadelement-in-ecmascript-documentation-is-it-the-same-as-spread-oper) 。展開要素がなければ、3つの配列が存在するか、またはN倍の 'foo'配列が配列の代わりに' Promises.all() 'から' .then() 'に渡されます。 Promise.all([[1,2,3]、[4,5,6]])then(data => console.log(data)); Promise.all([... [1,2,3]、... [4,5,6]])。then(data => console.log(data)) '。 – guest271314

1

はい、そうです。ここでPromise.all()の署名である:

Promise.all<T>: (Iterable<Promise<T>): Promise<T[]> 

は基本的に、それは約束の反復可能に受け入れ、およびプロミス自体を返します。

foo()の結果を渡すと、foo()はPromise自体を返すと予想されます。それ以外の場合は動作しません。

+0

さて、すぐに '[未定義、未定義、未定義]に解決されます。 – Ryan

+0

@Ryan Right、これはまったく役に立たない。 –

1

はい、foo()は約束を返す必要があります。あなたは配列にそれぞれの約束を追加し、それらのすべてを待つPromise.allを使用することができます。

var foo = x => { 
    var results = []; 

    for (var i = 0; i < 100; i++) { 
     results.push(
      someOtherFunctionThatReturnsAPromise(x) 
       .then(returnSomething) 
     ); 
    } 

    return Promise.all(results); 
}; 
関連する問題