如何使用async.js中的Promise进行编码?

背景

我通常会根据async.js编写node.js脚本来控制工作stream程。 有时我发现,基于async.js,代码似乎仍然是一个“地狱”。 如果使用多个嵌套,代码不可读,维护也非常棘手。 我在这里做了一些search,find了一些有用的资源 – 但其中大多数是一般的概念。 所以我会问一个问题。 对于任何反馈,我们都表示感谢。

我的通用代码

var request = require('request'); var async = require('async'); var array = [1, 2, 3, 4 ,5 ,6]; var url = 'http://www.google.com'; async.mapLimit(array, 3, function(number, callback) { request(url + number, function(error, res, body){ //do sth callback(); }); }, function(err){//do nothing}); 

所以这次我想用Promisereplace这种代码。 能否请你帮忙? 如果问题重复,请提供一些有用的资源url。 谢谢!

您需要Promisify request ,这可以通过原生承诺来完成,但是由于您使用的是NodeJS,因此如果您使用了蓝鸟许诺库(它几乎严格优于本机实现),那将是更可取的。

那你可以这样做:

 const Promise = require('bluebird'); const requestAsync = Promise.promisify(request); // This is what bluebird saves you // requestAsync returns a promise instead of accepting a callback. const array = [1, 2, 3, 4, 5, 6]; const requestSingle = number => requestAsync(`${url}${number}`); Promise.map(array, requestSingle, {concurrency: 3}); 

请注意, Promise.map()是一个蓝鸟function,而不是本机。

最接近您可以轻松获得与本机是:

 const arrayOfRequestPromises = array.map(requestSingle); Promise.all(arrayOfRequestPromises) .then(allResults => { // do something }) .catch(err => { // handle errors }); 

但是,那么你失去了最多3个并发请求选项。