【发布时间】:2016-02-01 17:39:17
【问题描述】:
我试图从概念上理解 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
});
【问题讨论】:
-
我认为生成器在这里没有任何帮助。您可以简单地遍历数组,而不是“手动”链接
.then调用。 -
如果每个后续结果都依赖于之前的 Promise 调用,这是真的吗?在我的示例中,我目前只是注销结果,但如果下一个 Promise 调用取决于上一个调用解析,那么我需要手动链接它,对吗?
-
没有。示例:
var p = Promise.resolve(); data.forEach(d => (p = p.then(result => someAsyncCall(d, result))));。您只需在循环中继续调用p = p.then(...)。这会将新的 Promise 链接到之前的 Promise。 -
感谢@FelixKling 提供示例!在什么情况下生成器对异步代码有用?
-
你可能会感兴趣:davidwalsh.name/async-generators.
标签: javascript generator ecmascript-6 es6-promise