2017-04-12 90 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); 
     }); 
     }) 
     } 

我認爲我的主要問題是:我在哪裏處理結果?我應該如何傳遞這樣的值,以便返回數組構建正確?

+0

你能總結一下,也許你想更廣泛地完成什麼?看起來你有一個數組的數組,並且你想遍歷每一個元素並在每個元素上調用3個異步函數,然後將這3個異步調用的結果存儲在一個新的數組中(數組?)...是那裏發生了什麼?另外:處理的順序是否重要?你需要知道整個過程何時完成? –

+0

我有一個包含對象數組的對象,其中一個是我需要循環並執行一組promise函數的數組。我最終以一種完全不同的方式使用藍鳥,我會發布答案 – 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); 
       } 
      ) 
     }