当我们通过 for..of 迭代它时,我们可以将参数传递给生成器吗?
Can we pass parameters to a generator when we iterate it via for..of?
我在想一个搭建promise队列的场景:
//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..of 将负责实际的迭代:
for (var r of promiseGenerator) {
}
在上面的代码中,生成器将被成功迭代,但不幸的是,我不知道如何在 for..of.
的迭代中将参数成功传递给该生成器
我想澄清一下,我不需要替代方案,我完全知道我们可以这样做:
for (var p in promiseQueue) promiseGenerator.next(promiseQueue[p]);
我特别想知道在执行 for..of 循环时是否可以将参数传递给生成器。
编辑
amn 提出的问题是,在示例中 he/she 一直关注 would always get undefined
。如果我们将 undefined
传递给 next()
,那是真的,但如果我们传递其他东西,则不是真的。我提出的问题是 for..of 循环不允许我们将任何东西传递给 yield
,这是这个特定问题的全部内容,该示例仅是问题的说明,表明承诺我们将创建永远不会在 for..of 循环中创建。但是,可迭代对象在 for..of 循环范围之外还有生命,我们可以将定义的值传递到 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
不能从头假设为 undefined
。当然我们可以传递一些自定义的 thenables,比如
Promise.resolve({
then: function(onFulfill, onReject) { onFulfill('fulfilled!'); }
});
甚至是尚未解决的承诺。该示例的要点是表明我们不能使用 for..of 循环将值传递给 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);
除非缺少一些 try/catch
包装器。你可以看到 in the spec here 它调用 .next
没有参数:
Let nextResult be ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]], « »).
例如
iterator.next.apply(iterator, []);
使用空参数数组调用 next()
。
我在想一个搭建promise队列的场景:
//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..of 将负责实际的迭代:
for (var r of promiseGenerator) {
}
在上面的代码中,生成器将被成功迭代,但不幸的是,我不知道如何在 for..of.
的迭代中将参数成功传递给该生成器我想澄清一下,我不需要替代方案,我完全知道我们可以这样做:
for (var p in promiseQueue) promiseGenerator.next(promiseQueue[p]);
我特别想知道在执行 for..of 循环时是否可以将参数传递给生成器。
编辑
amn 提出的问题是,在示例中 he/she 一直关注 would always get undefined
。如果我们将 undefined
传递给 next()
,那是真的,但如果我们传递其他东西,则不是真的。我提出的问题是 for..of 循环不允许我们将任何东西传递给 yield
,这是这个特定问题的全部内容,该示例仅是问题的说明,表明承诺我们将创建永远不会在 for..of 循环中创建。但是,可迭代对象在 for..of 循环范围之外还有生命,我们可以将定义的值传递到 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
不能从头假设为 undefined
。当然我们可以传递一些自定义的 thenables,比如
Promise.resolve({
then: function(onFulfill, onReject) { onFulfill('fulfilled!'); }
});
甚至是尚未解决的承诺。该示例的要点是表明我们不能使用 for..of 循环将值传递给 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);
除非缺少一些 try/catch
包装器。你可以看到 in the spec here 它调用 .next
没有参数:
Let nextResult be ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]], « »).
例如
iterator.next.apply(iterator, []);
使用空参数数组调用 next()
。