ES6 系列之系列之 Generator 的自动执行的方法示例的自动执行的方法示例
主要介绍了ES6 系列之 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);
}
为了获得最终的执行结果,你需要这样做:
var g = gen();
var result = g.next();
result.value.then(function(data){
return data.json();
}).then(function(data){
g.next(data);
});
首先执行 Generator 函数,获取遍历器对象。
然后使用 next 方法,执行异步任务的第一阶段,即 fetch(url)。
注意,由于 fetch(url) 会返回一个 Promise 对象,所以 result 的值为:
{ value: Promise { <pending> }, done: false }
最后我们为这个 Promise 对象添加一个 then 方法,先将其返回的数据格式化(data.json()),再调用 g.next,将获得的数据传
进去,由此可以执行异步任务的第二阶段,代码执行完毕。
多个异步任务多个异步任务
上节我们只调用了一个接口,那如果我们调用了多个接口,使用了多个 yield,我们岂不是要在 then 函数中不断的嵌套下
去……
所以我们来看看执行多个异步任务的情况:
var fetch = require('node-fetch');
function* gen() {
var r1 = yield fetch('https://api.github.com/users/github');
var r2 = yield fetch('https://api.github.com/users/github/followers');
var r3 = yield fetch('https://api.github.com/users/github/repos');
console.log([r1.bio, r2[0].login, r3[0].full_name].join(''));
}
为了获得最终的执行结果,你可能要写成:
var g = gen();
var result1 = g.next();
result1.value.then(function(data){
return data.json();
})
.then(function(data){
return g.next(data).value;
})
.then(function(data){
return data.json();
})
.then(function(data){
return g.next(data).value
})
.then(function(data){
return data.json();
})