forサイクル中にPromise非同期操作を行う問題のまとめ

4011 ワード

forサイクルでPromise非同期操作をする時、主に二つの問題に遭遇します.
  • 1は、どのようにしてすべてのfor循環中のPromise動作を終了させた後、ある操作を実行しますか?
  • は、ループ中に後続のPromiseの実行依存性が前のPromiseの実行結果(例えば、あるデータベース操作)
  • である.
    問題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("       ,        ");
        });
      }
    }