使用生成器的异步js代码

时间:2017-06-08 15:22:48

标签: javascript asynchronous ecmascript-6 generator

我需要处理一些数据。我可以像这样同步和异步方式(简化):

  1. 同步方式:

    for (var i in input) {
        result += input[i]
    }
    
  2. 异步方式

    function f(input,cb) {
      var result;
      if (!input) {
        setTimeout(function() {cb(result)},500);
      } else {
        f(input.slice(1),function(r) {
          result+=input[0];
        });
      }
    }
    
  3. 是否可以使用生成器重写异步代码?我希望我有一些For循环代码而不是递归。

1 个答案:

答案 0 :(得分:0)

使用await(更新的ES2017技术built on generators in ES6),并假设,正如您所说:

  • 您有多个项目(在本例中为['apple', 'peach', 'banana']
  • 您希望对它们执行一些异步操作
  • 您希望避免回调和.then()(如果您使用的是节点7+或当前浏览器,这是一个好主意)

然后:

var doThing = async function (input) {
    return new Promise(function(resolve, reject) {
        setTimeout(function(){
            resolve(`Result for ${input}`)
        }, 2000);
    });
}


var start = async function(listOfThings){
    var result = await Promise.all(listOfThings.map(doThing))
    console.log('All done', result)
}

start(['apple', 'peach', 'banana'])

将返回:

All done [ 'Result for apple', 'Result for peach', 'Result for banana' ]

要从网络获取一些数据,您只需将setTimeout替换为superagent或(如果您要编写自己的查询字符串编码,URL处理等){{1} }。