当我们通过for.of迭代生成器时,我们可以将参数传递给它吗



我正在考虑建立一个承诺队列的场景:

//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。如果我们传递undefinednext(),这是真的,但如果我们传递其他东西,这就不是真的。我提出的问题是。。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。

相关内容

最新更新