代码之家  ›  专栏  ›  技术社区  ›  Lajos Arpad

当我们迭代一个生成器时,我们可以将参数传递给它吗?

  •  0
  • Lajos Arpad  · 技术社区  · 6 年前

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

    //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..将负责实际迭代:

    for (var r of promiseGenerator) {
    
    }
    

    在上面的代码中,生成器将成功迭代,但不幸的是,我不知道在for..的迭代中成功地将参数传递给此生成器的方法。

    我想澄清一下,我不需要另一种选择,我非常清楚我们可以这样做:

    for (var p in promiseQueue) promiseGenerator.next(promiseQueue[p]);
    

    我特别有兴趣知道在执行for..of循环时是否可以将参数传递给生成器。

    1 回复  |  直到 6 年前
        1
  •  2
  •   loganfsmyth    6 年前

    不,不能将参数传递给 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 没有参数:

    让下一个成为?调用(迭代器记录。[[NextMethod]],迭代器记录。[[迭代器]],«»)。

    例如

    iterator.next.apply(iterator, []);
    

    打电话 next() 参数数组为空。

    推荐文章