Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

丧心病狂的玩法 async generator

  还在写 ES5 的同学们可能觉得 generator 和 async 都是比较难理解的概念,然而还有更丧心病狂的 async 和 generator 同时使用的玩法!这个设计是为了在 generator 中使用 await 么?可是这会让每次迭代返回的对象都被包上一个 Promise,导致 for-of 用不了?
  yield 后面接一个 Promise 对象,在 for-of 中 await 不就足够了么?比如 var delay = (n, e) => new Promise(resolve => {
  setTimeout(() => resolve(e), n);
});

var I = function * () {
  for(let i = 0; i < 10; i++) {
    yield delay(200, i);
  }
};

var A = function() {};
A.prototype[Symbol.iterator] = I;

void async function() {
  for(let i of new A()) {
    console.log(await i);
  }
}();
  这样至少 for-of 是可用的。可是如果把 generator 也加上 async 的话就变成了这样 var delay = (n, e) => new Promise(resolve => {
  setTimeout(() => resolve(e), n);
});

var I = async function * () {
  for(let i = 0; i < 10; i++) {
    yield delay(200, i);
  }
};

void async function() {
  let a = new I();
  while(1) {
    let i = await a.next();
    if(i.done) break;
    console.log(i.value);
  }
}();
  于是 for-of 就用不了了。注意第一个例子中 await 处理的是 for-of 的 i,也就是 a.next().value。而第二个例子中 await 处理的是 a.next()。这也是为什么 for-of 用不了的原因(也许以后的版本会修复这个问题)。
  或许是我没领悟这份良苦用心吧?我至今还是觉得 async 和 generator 一起用不仅没有解决问题,反而把程序搞得一团糟。
网名:
34.203.245.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^