forサイクル中にPromise非同期操作を行う問題のまとめ
4011 ワード
forサイクルでPromise非同期操作をする時、主に二つの問題に遭遇します. 1は、どのようにしてすべてのfor循環中のPromise動作を終了させた後、ある操作を実行しますか? は、ループ中に後続のPromiseの実行依存性が前のPromiseの実行結果(例えば、あるデータベース操作) である.
問題1、forサイクル中のPromiseを全部完成させたら、どのようにある操作を実行しますか?
解決方法は2つあります.1つは0に初期化された変数によって、forサイクルの各Promiseに対して、その+1に対して、その値がサイクル数と一致すると判断した場合、forサイクル中のPromiseが全部実行されたということです.
解決方法は2つあります.1つは再帰によって再帰の回数は循環の回数であり、非同期のコールバックで再帰をトリガする方法です.コードは以下の通りです.
問題1、forサイクル中のPromiseを全部完成させたら、どのようにある操作を実行しますか?
解決方法は2つあります.1つは0に初期化された変数によって、forサイクルの各Promiseに対して、その+1に対して、その値がサイクル数と一致すると判断した場合、forサイクル中のPromiseが全部実行されたということです.
let flag=0;
for(let i=0;i//
xxx.exec((i)=>{
flag++;
if(flag===LEN){
console.log("All Promise finished");
}
});
//
xxx.exec(i).then(()=>{
flag++;
if(flag===LEN){
console.log("All Promise finished");
}
});
}
方法2は、forをPromiseのthenチェーンに循環させ、forループの上のレベル自体がPromiseであれば直接thenでいいです.そうでなければ、newの空いているPromiseコードは以下の通りです..then(()=>{
for(let i=0;i<10;i++){
//
xxx.exec(i);
}
})
.then(()=>{
console.log("All Promise finished");
})
もし上級者がPromiseでないなら、自分はnewです.new Promise(function(resolve){
resolve();
}).then(()=>{
for(let i=0;i<10;i++){
//
xxx.exec(i);
}
}).then(()=>{
console.log("All Promise finished");
});
問題2、サイクル中に次のPromiseの実行依存が前のPromiseの実行結果(必要な場合は現在のPromiseが実行されてから次のサイクルを行います.)解決方法は2つあります.1つは再帰によって再帰の回数は循環の回数であり、非同期のコールバックで再帰をトリガする方法です.コードは以下の通りです.
function loopArray(x) {
xxx.exec().then( () => {
x++;
if ( x < LEN ) {
console.log(" , ");
loopArray( x);
}
} );
}
loopArray(0);
方法の2つはasyncとawaitを通じて(node環境を推奨します.node 8はインストール依存パッケージではなく)async function loopArray() {
for ( let i=0; i//await Promise
await xxx.exec().then(()=>{
console.log(" , ");
});
}
}