【发布时间】:2017-08-29 08:53:31
【问题描述】:
我想分块运行一个函数,所以它会等待 10k 个 promise 解决然后继续,我使用以下生成器函数:
function* processNodes(nodes, task){
let i;
let cnt = 0;
let promiseArray = new Array(10000);
let pInd = 0;
let currId;
for(i = 0; i<nodes.length; i++){
currId = nodes[i];
promiseArray[pInd++] = asyncFunc(currId, 0, task); // return a promise
cnt++;
if(cnt > 10000){
console.log("going to yield", promiseArray)
let pall = Promise.all(promiseArray);
console.log("promise all", pall);
yield pall;
console.log("return from yield"); // never get here
pInd = cnt = 0;
}
}
}
但即使我看到pall 已解决,它也永远不会从产量中返回。
可以用生成器函数做这样的事情吗?
编辑: 我想我想做的是实现像 Bluebird 的协程这样的东西:http://bluebirdjs.com/docs/api/promise.coroutine.html
Edit2:这就是我调用这个函数的方式:
let x = processNodes(allNodes, someSimpleTask);
x.next();
【问题讨论】:
-
你能展示你测试这个函数的代码吗?
yield将暂停函数,直到调用者使用该值。 -
这个:
console.log("return from yield"); // never get here@trincot -
我指的不是那个代码,而是调用函数的主要代码。
-
这里太大了,无法包含...@trincot
-
我不确定我是否理解您的用例:首先,您创建了 10'000 个承诺。然后你
yield,首先是 10'000 个承诺,然后是 10'001、10'002 等等……
标签: javascript asynchronous ecmascript-6 generator