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

标签 javascript ecmascript-6 es6-promise es6-generator

我正在考虑建立 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 *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 传递给 next(),则情况如此,但如果我们传递其他内容,则情况并非如此。我提出的问题是 for..of 循环不允许我们将任何内容传递给yield,这是这个特定问题的全部内容,该示例只是问题的说明,显示我们将创建的 promise 永远不会在 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不能被假设为未定义。当然我们可以传递一些自定义的thenables,比如

Promise.resolve({ 
  then: function(onFulfill, onReject) { onFulfill('fulfilled!'); }
});

甚至是尚未解决的 promise 。该示例的要点是表明我们无法使用 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()

关于javascript - 当我们通过 for..of 迭代它时,可以将参数传递给生成器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54165504/

相关文章:

javascript - 在 ES6/Typescript 中链接 promises

javascript - Promise 的串行执行

javascript - 如何优雅地使用 v-model 和 Vuex store?

javascript - 如何使用ES6 super在子构造函数中调用父方法?

javascript - 如何清除缓存中下载的图像

javascript - 定制 ES6 数组过滤的结果

javascript - 获取与特定字符串匹配的对象的 json 数组的长度

javascript - 在 React 中使用 JS ES6 Promise 时出现问题 - TypeError : Cannot read property 'then' of undefined

javascript - FirebaseError : Function addDoc() called with invalid data. 不支持的字段值:未定义

javascript - 如何查找其中包含特定标签的 li 标签的索引