gpt4 book ai didi

javascript - 如何结合 ES6 Generators 和 Promises

转载 作者:行者123 更新时间:2023-11-30 12:12:06 24 4
gpt4 key购买 nike

我试图从概念上理解 ES6 生成器如何使异步代码更加精简。这是一个人为的例子:

  1. 我有一个名为 getGitHubUser 的函数,它接受一个用户名并返回一个最终解析为 github 用户信息的 Promise。
  2. 我有一组用户名。
  3. 我想用第一个用户名调用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com