javascript - 如何结合 ES6 Generators 和 Promises

标签 javascript generator ecmascript-6 es6-promise

我试图从概念上理解 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/

相关文章:

javascript - d3.js:顺序缩放和缩放/平移

带有检查空条件的 python 生成器

javascript - Flow : computed property. Indexable signature not found in... 当类型为类时

python - 将成对生成器变成一对生成器

python - 在列表中有效但奇怪地使用yield

javascript - 在从函数返回的对象上使用ES6传播运算符

javascript - Fetch() 2 个 JSON then() 传递给函数

javascript - 如何从 HH :MM AM time string in Javascript? 中减去小时数

javascript - 如何使用javascript添加 "selected"来选择选项

javascript - 在 Vue js 中使用 Sweet Alert 删除确认