关于Generator的一点疑问

在学习js中generator/promise/async-await等知识时遇到了一个generator函数的问题:

var fetch = require('node-fetch');

function* gen(){
  var url = 'https://api.github.com/users/github';
  var result = yield fetch(url);
  console.log(result.bio);
}

这段代码描述了一个简单的generator的用法,使用时需要对next()函数获得的promise返回值多次then(),从而获取最终的json变量,传入第二个next()函数中。

可以看到,代码中的result变量就是那个promise,而result.bio实际上是不存在,或者说不对的,
应该是result.then(...).then(...).bio
【Ⅰ不知我此处说的对不对?】

所以关于generator的自动执行,使用async-await的方式,实际上是把对多个promise返回值进行获取(获取成功时的value)并最终传给下一个next()函数。而generator函数内容中yield之后的部分对yield语句的值(上述代码中的result)的使用,其实就是把他替换成了这个最终的value来使用。
【Ⅱ不知我此处说的对不对?】

最后,generator以及async-await的使用,其实就是将本是异步的promise.then()函数转换成同步的。
【Ⅲ不知我此处说的对不对?】

不知我的理解有没有问题。
如果有更好的理解方式或是相关文章,也感谢说明或指明。

阅读 1.7k
1 个回答

不知你是否是学习的阮一峰的es6入门,关于这部分讲的很清楚。
这段代码的调用方式是:

var g = gen();
var result = g.next();

result.value.then(function(data){
  return data.json();
}).then(function(data){
  g.next(data);
});

yield 本身没有返回值,next方法带参数时,该参数就会被当作上一个 yield 表达式的返回值。console.log(result.bio);当调用next()时,这里的 result 应该是 undefined;当调用next(data)时,这里的 result 是 data。
“async函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而await命令就是内部then命令的语法糖。”
async函数内部所有await命令执行完后return的最终结果返回到 Promise.then 的回调函数中。es6入门中的例子:

async function getStockPriceByName(name) {
  const symbol = await getStockSymbol(name);
  const stockPrice = await getStockPrice(symbol);
  return stockPrice;
}

getStockPriceByName('goog').then(function (result) {
  console.log(result);  // stockPrice
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题