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