我正在考虑建立一个承诺队列的场景:
//Let's assume that promises is an array of promises
var promiseQueue = [];
for (var promise of promises) {
if (promiseQueue.length) promiseQueue[promiseQueue.length - 1].then(promise);
promiseQueue.push(promise);
}
我正在考虑实现一个function
被调用的resolver
:
function *resolve() {
var promise;
while (promise = yield) Promise.resolve(promise);
}
然后迭代它:
var promiseGenerator = resolve();
问题是这里的 for..of 将负责实际的迭代:
for (var r of promiseGenerator) {
}
在上面的代码中,生成器将被成功迭代,但不幸的是,我不知道在 for..of 的迭代中成功将参数传递给此生成器的方法。
我想澄清一下,我不需要替代方案,我完全清楚我们可以做这样的事情:
for (var p in promiseQueue) promiseGenerator.next(promiseQueue[p]);
我特别想知道在执行 for..of 循环时是否可以将参数传递给生成器。
编辑
amn 提出的问题是,在他/她关注的示例中,总是会得到undefined
. undefined
如果我们传递给,那是真的next()
,但如果我们传递别的东西,那不是真的。我提出的问题是 for..of 循环不允许我们将任何内容传递给yield
,这就是这个特定问题的全部内容,该示例仅是对问题的说明,表明我们将创建的承诺永远不会在 for..of 循环中创建。然而,在 for..of 循环范围之外,Iterable 对象也有生命,我们可以将定义的值传递给yield
. 带有批评代码块的示例如下所示:
function *resolve() {
var promise;
while (promise = yield) Promise.resolve(promise);
}
var responses = [];
var f = resolve();
var temp;
for (var i = 10; !(temp = f.next(i)).done; i--) responses.push(temp);
正如我们在yield
上面看到的,不能假设上述内容 ab ovo 是undefined
。当然我们可以传递一些自定义的thenables,比如
Promise.resolve({
then: function(onFulfill, onReject) { onFulfill('fulfilled!'); }
});
甚至是尚未解决的承诺。该示例的重点是表明我们不能将值传递给yield
使用 for..of 循环,在我看来这是一个很大的功能差距。