繁体   English   中英

使用生成器异步js代码

[英]async js code using generators

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

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

是否可以使用生成器重写异步代码? 我希望我有一些For循环代码,而不是递归代码。

使用await (一种基于ES6中的生成器的更新的ES2017技术),并假设,如您所说:

  • 您有多个项目(在本例中为['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处理等) fetch

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM