如何将ES6生成器与Promise结合起来

时间:2015-11-01 21:28:31

标签: javascript generator ecmascript-6 es6-promise

我试图在概念上理解ES6 Generators如何使异步代码更加简化。这是一个人为的例子:

  1. 我有一个名为getGitHubUser的函数,它接受一个用户名并返回一个Promise,最终解析为github用户的信息。
  2. 我有一组用户名。
  3. 我想用第一个用户名调用getGitHubUser,当Promise解析时,我想用下一个用户名调用getGitHubUser,并继续这个,直到我遍历所有用户名。
  4. 我有一个有效的实施方案,但我对如何利用生成器来改善这一点感到更好奇。

    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
      });
    

1 个答案:

答案 0 :(得分:1)

这是使用Q执行此操作的方法。另请阅读Harmony generators and promises for Node.js async fun and profitJavaScript Promises

var usernames = ["fay-jai", "jyek", "Maestro501", "jaclyntsui"];
Q.spawn(function *(){
  var index = 0;
  while (index < usernames.length){
    console.log(yield Promise.resolve($.get("https://api.github.com/users/" + usernames[index])));
    index++;
  }
});