2016-03-03 147 views
1

传统上,同步语言,具有两个嵌套的foreach任务循环有条件的退出将是一个容易的任务,如:管理嵌套的异步foreach循环

return new Promise(resolve, reject){ 
    AnArray.forEach(anElement){ 
     ACONSTANTARRAY.forEach(ACONSTANTELEMENT){ 
      if(anElement === ACONSTANTELEMENT){ 
       resolve(bar); 
      } 
     } 
    } 
    resolve(foo); 
} 

然而,因为foo将得到解决立即处理这种情况的最佳方法是什么?我必须将其转换为多个Promise.all(array.map(function(){})呼叫吗?看起来很丑陋,过于复杂并且很难理解。

+0

你的异步代码在哪里?如果你显示你的异步代码,我们可以帮助你更好。而且,如果没有异步代码,那么可能根本就不需要承诺。真正的代码而不是伪代码会给我们提供最有用答案的更好机会。 – jfriend00

+0

@ jfriend00我想保持尽可能的异步。 – hownowbrowncow

+1

在进行同步操作异步时没有通用点。它只会让你的代码比需要更复杂。 '.forEach()'循环是同步的。一直都是。请向我们展示真实的代码,以便我们可以帮助您找到真正的问题的真正解决方案 - 而不是对未描述的问题的理论解决方案。你想解决什么真正的问题? – jfriend00

回答

1

对不起,你不喜欢它,但如果你需要等待所有的异步操作完成前继续前进,你必须使用Promise.all

return Promise.all(AnArray.map(anElement => 
    new Promise((resolve, reject) => { 
     if (ACONSTANTARRAY.find(ACONSTANTELEMENT => ACONSTANTELEMENT === anElement)) { 
     return resolve(bar); 
     } 
     reject(foo); 
    }); 
); 

上面没有做任何异步,但。请记住,有许多异步库为您创建承诺,因此您甚至可能根本不需要执行new Promise。您仍然需要使用Promise.all,但是如果您需要等待多个承诺才能解决。

你也可以考虑使用类似co的东西来处理基于生成器的控制流程,该流程处理你的承诺数组。

+2

由于这里没有异步代码,所以我不清楚这个解决了什么实际问题。这似乎是其中一种情况,最好坚持OP解释实际问题,而不是回答假设可能是错误的做法。 – jfriend00

+0

@ jfriend00你是绝对正确的;我甚至在我的回答中指出了这一点。我想像他想要做的实际数组比较是以某种方式异步的,但绝对可能不是这种情况。 –