生成器+承诺并行化N个项目

时间:2016-08-18 04:14:29

标签: javascript asynchronous ecmascript-6 generator q

挑战:

  1. 我们希望为一个项目的孩子提供N个并行的ajax请求。
  2. 返回时,我们希望按顺序处理它们(1 ... N)
  3. 我们不想等待所有承诺返回,但我们希望在他们回来时按顺序处理它们。
  4. 例如:

    即使2,3,5在1之前回来,我们应该保持2,3,5的结果,并且在1回复时,按顺序处理1,2,3(并等待4在5)之前回来。

    工具:Q + ES6发电机

    使用占位符变量

    创建N-1长度数组 <=>当N = 3时的EG:

    let [N1,N2,N3] = yield [ Promise1, Promise2, Promise3 ]
    
    //process items sequentially:
       console.log(N1)
       console.log(N2)
       console.log(N3)
    

    但是,填充一系列空变量似乎并不起作用,因为参考文献并不知道在哪里可以找到var声明

    for(var i = 0; i< 3; i++) {
       res.push("some empty var")
    }
    

    考虑到坚持使用提供的工具的限制,我们如何并行化调用,但是按顺序处理它们的返回?

2 个答案:

答案 0 :(得分:2)

您可以使用Promise.all().then()

答案中的

javascript会返回问题

中描述的确切结果
  
      
  1. 我们希望为一个项目的孩子提供N个并行的ajax请求。
  2.   
  3. 返回时,我们希望按顺序处理它们(1 ... N)
  4.   
  5. 我们不想等待所有承诺返回,但我们希望在它们回来时按顺序处理它们。   我们怎么能并行调用,但处理他们的回报   依次?
  6.   

您可以使用.then()链接到原始函数,该函数返回一个promise或Promise对象本身,以便在return值之前处理promise,并按照传递给{{的参数的顺序处理1 {} Promise.all()链接到.then()

&#13;
&#13;
Promise.all()
&#13;
&#13;
&#13;

答案 1 :(得分:1)

你可以通过等待循环中的下一个承诺来做到这一点:

const promises = […]; // or created programmatically
for (const promise of promises) {
    const result = yield promise; // await them sequentially
    console.log(result);
}