我试图从概念上理解 ES6 生成器如何使异步代码更加精简。这是一个人为的例子:
- 我有一个名为 getGitHubUser 的函数,它接受一个用户名并返回一个最终解析为 github 用户信息的 Promise。
- 我有一组用户名。
- 我想用第一个用户名调用 getGitHubUser,当 Promise 解析时,我想用下一个用户名调用 getGitHubUser,并继续此操作,直到我遍历所有用户名。
我有一个有效的实现,但我更好奇如何利用生成器来改进它。
var getGitHubUser = (user) => {
// using jQuery's $.get
return Promise.resolve($.get("https://api.github.com/users/" + user));
};
var usernames = ["fay-jai", "jyek", "Maestro501", "jaclyntsui"];
getGitHubUser(usernames[0])
.then((result) => {
console.log(result); // fay-jai
return getGitHubUser(usernames[1]);
})
.then((result) => {
console.log(result); // jyek
return getGitHubUser(usernames[2]);
})
.then((result) => {
console.log(result); // Maestro501
return getGitHubUser(usernames[3]);
})
.then((result) => {
console.log(result); // jaclyntsui
});
最佳答案
如果您想了解它的工作原理,请考虑这个 good article .
如果您正在寻找一些工作解决方案,有很多库可以处理回调 hell (因为基本上这是人们寻找更优雅的解决方案的主要原因)。
Q.spawn
已经由 @user890255 在他的回答中给出了一个简短的描述,但还有其他的。例如,co我最喜欢的:
var request = require('superagent');
co(function* () {
var data = [];
for(var i = 0; i < usernames.length; i++){
data.push(yield request.get("https://api.github.com/users/" + usernames[i]));
}
return data;
}).then((value) => {
console.log(value);
}, (err) => {
console.error(err.stack);
});
如您所见,co
总是返回一个 promise,这非常方便。
极简主义(我想是因为文件很小)vo
var request = require('superagent');
vo(function* () {
var data = [];
for(var i = 0; i < usernames.length; i++){
data.push(yield request.get("https://api.github.com/users/" + usernames[i]));
}
return data;
})((err, res) => {
console.log(res);
});
如您所见,生成器函数中的代码几乎相同。
干杯!
关于javascript - 如何结合 ES6 Generators 和 Promises,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33467441/