2017-04-12 2 views
0

私は約束ループを入れ子にしていて、問題の解決法を見つけるのが難しいです。ネストされた配列をループすることを約束する

私は周りを見回したとこれを見つけた:https://stackoverflow.com/a/29396005/3560729

promiseWhile機能は、私が必要なものを持っているようだが、私はネストが外側のループ

promiseWhileに復帰するのに問題を抱えている:

function promiseWhile(predicate, action) { 
    function loop() { 
    if (!predicate()) return; 
     return Promise.resolve(action()).then(loop); 
    } 
    return Promise.resolve().then(loop); 
} 

ネステッド・ループ:

let outerArray = outerArrayOfObjects; 
    let returnArray = []; 
    let returnArrayIndex = 0; 
    let outerIndex = 0; 
    let outerLength = outerArray.length; 
    let passObject = { }; 

    promiseWhile(function() { 
     return outerIndex < outerLength; 
    }, function() { 
     let innerIndex = 0; 
     let innerLength = outerArray[outerIndex].innerArray.length; 

     passObject = { 
      innerObject: outerArray[outerIndex].innerArray[innerIndex], 
      returnArray: returnArray, 
      returnArrayIndex: returnArrayIndex 
     }; 
     promiseWhile(function() { 
      return innerIndex < innerLength; 
     }, function() { 
      return new Promise(function(resolve, reject){ 
       Promise.all([ 
        promiseFunction1(innerObject), 
        promiseFunction2(innerObject), 
        promiseFunction3(innerObject), 
       ]) 
        .then(function (allMappings) { 
         passObject.returnArray[returnArrayIndex++] = { 
          "result1": allMappings[0], 
          "result2": allMappings[1], 
          "result3": allMappings[2] 
         } 
         offersIndex++; 
         return resolve(passObject) 
        }) 
        .catch(function (err) { 
         offersIndex++; 
         return reject(err); 
        }) 
      }) 
     }) 
     outerIndex++; 
     }).then(function() { 
     return resolve(passObject); 
     }); 
     }) 
     } 

私の主な質問は次のとおりだと思います:結果はどこで処理されますか? return配列が適切に構築されるように、どのように値を渡すべきですか?

+0

あなたは多分あなたはより一般的に達成しようとしているもの要約してもらえますか?あなたは配列の配列を持っているようですが、すべての項目を繰り返し処理し、それぞれに3つの非同期関数を呼び出し、それらの3つの非同期呼び出しの結果を新しい配列(配列の?ここで何が起こっているの?また、処理の順序は重要ですか?そして、プロセス全体がいつ完了するのかを知る必要がありますか? –

+0

私はオブジェクトの配列を含むオブジェクトを持っています。そのうちの1つは、ループして一連の約束関数を実行する必要がある配列です。私は青い鳥を使って全く別のアプローチで行くことになった、私は答えを投稿します – GForce

答えて

0

上記のpromiseWhileはアクションの実行には適していますが、ネストされたループ内の値を設定して結果を返すのには適していません。

私は青い鳥を使ったアプローチと一緒に行くことになった:

 var Promise = require('bluebird'); 
     let outerArray = object.outerArray; 
     let returnArray = []; 
     let returnIndex = 0; 
     Promise.map(outerArray, function (outerArrayObject) { 
      let innerArray = outerArrayObject.innerArray; 
      let outerArrayValue = outerArrayObject.value; 

      Promise.map(innerArray, function (innerArrayObject) { 

       Promise.all([ 
        PromiseFunction1(innerArrayObject), 
        PromiseFunction2(innerArrayObject), 
        PromiseFunction3(innerArrayObject), 
       ]) 
        .then(function (allResults) { 
         returnArray[returnIndex++] = { 
          "result1": allResults[0], 
          "result2": allResults[1], 
          "result3": allResults[2], 
          "result4": outerArrayValue, 
         } 
         return resolve(returnArray); 
        }) 
        .catch(function (err) { 
         return reject(err); 
        }) 
      }) 
     }) 
      .then(function() { 
        return resolve(returnArray) 
       } 
      ).catch(function(err){ 
        return reject(err); 
       } 
      ) 
     } 
関連する問題