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

How to code with Promise from async.js?

背景

我通常会根据async.js写node.js脚本来控制工作流程。有时我发现基于async.js,代码似乎还是一个'hell'。使用多个嵌套,代码不可读且难以维护。我在这里进行了一些搜索,发现了一些有用的资源——但其中大部分都是一般概念。所以我要问一个问题。如有任何反馈,我们将不胜感激。

我的常用代码

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

问题

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

您将需要 ,这可以通过原生 promises 完成,但由于您使用的是 NodeJS,因此最好使用 Bluebird promise 库,它几乎严格优于本机实现。

那么你可以这样做:

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() 是 Bluebird 的一项功能,而非原生功能。

最接近原生的是:

const arrayOfRequestPromises = array.map(requestSingle);

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

但是你失去了最大 3 个并发请求选项。