我正在考虑建立一个承诺队列的场景:
//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);
}
我正在考虑实现一个名为resolver
:的function
function *resolve() {
var promise;
while (promise = yield) Promise.resolve(promise);
}
然后迭代:
var promiseGenerator = resolve();
问题出在。。其中负责实际迭代的:
for (var r of promiseGenerator) {
}
在上面的代码中,生成器将被成功迭代,但不幸的是,我不知道如何在for的迭代中成功地将参数传递给该生成器。。属于
我想澄清一下,我不需要其他选择,我完全知道我们可以做这样的事情:
for (var p in promiseQueue) promiseGenerator.next(promiseQueue[p]);
我特别感兴趣的是,当我执行for时,是否可以将参数传递给生成器。。循环。
编辑
amn提出的问题是,在他/她关注的例子中,总是会得到undefined
。如果我们传递undefined
到next()
,这是真的,但如果我们传递其他东西,这就不是真的。我提出的问题是。。of循环不允许我们将任何内容传递给yield
,这就是这个特定问题的全部内容,该示例只是对问题的说明,表明我们将创建的承诺永远不会在for中创建。。循环的。然而,在for的范围之外,Iterable对象还有生命。。循环,我们可以将定义的值传递到CCD_ 7中。一个被批评的代码块的例子可能看起来像:
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
不能直接假设为undefined
。当然,我们也可以通过一些自定义的数字,比如
Promise.resolve({
then: function(onFulfill, onReject) { onFulfill('fulfilled!'); }
});
甚至是尚未解决的承诺。该示例的重点是表明我们不能使用for将值传递给yield
。。在我看来,这是一个相当大的功能差距。
否,不可能将参数传递给next
。
function* generateItems() { /* ... */ }
for (var item of generateItems()) {
console.log(item);
}
主要是的缩写
function* generateItems() { /* ... */ }
var iterator = generateItems()[Symbol.iterator]();
do {
const result = iterator.next();
if (result.done) break;
const item = result.value;
console.log(item);
} while (true);
除了一些丢失的CCD_ 12包装器之外。您可以在这里的规范中看到,它在没有参数的情况下调用.next
:
让nextResult是?调用(迭代器记录。[[NextMethod]],迭代器纪录。[[Iterator]],«»)。
例如
iterator.next.apply(iterator, []);
使用参数的空数组调用CCD_ 14。