私は一連の約束が完了するのを待っています。私はPromise.all
でこれを行うことができると知っていますが、それらの約束のうちの1つが約束のリストに新しい約束をするとき、何をすべきか分かりません。再帰Promise.all?
例:
asyncFunction(...).then(result => {
// do something
});
asyncFunction(...).then(result => {
for(let row of result) {
asyncFunction(row);
}
});
console.log(promises.length); // 2
await Promise.all(promises);
console.log(promises.length); // 5
asyncFunction
のようなものである:ここに起こった何
const asyncFunction = (...args) => {
let result = new Promise((resolve, reject) => {
pool.query(...args, (err, rows, fields) => {
if (err) {
reject(err);
} else {
resolve(rows);
}
});
});
promises.push(result);
return result;
};
するのでpromises.length
しかし2で、私のpromises
配列にasyncFunction
プッシュ約束への最初の二つの呼び出しということですそれらが完了するのを待ってから、Promise.all
が既にその配列を評価しているので、第2のものが配列に新しい約束を押し込むので、待たれていません。
どのように私はすべての約束と新しいものを待つことができますか?この例ではawait Promise.all(promises)
を2回呼び出すだけで動作しますが、これは無限になります。私は単にこれでPromise.all
を交換し、正常に動作すべきだと思う
function recursiveAll(array) {
// Wait for the promises to resolve
return Promise.all(array).then(function(result) {
// If no new promises were added, return the result
if (result.length == array.length)
return result;
// If new promises were added, re-evaluate the array.
return recursiveAll(array);
});
}
プールに任意のタイミングで押し込まないでください。プールが満杯になるのを待ってから、 'それで' Promise.all'を呼び出します。異なる時間にプッシュする必要がある場合、 'Promise.all'を複数回呼び出す必要がある場合は、すべてを1つの配列にまとめてください。 – Bergi
@Bergi新しい約束事は、以前の非同期結果の結果として作成されます。 – user2864740
[this](http://stackoverflow.com/q/37801654/1048572)は役に立ちますか? – Bergi