如何使用来自 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 个并发请求选项。
背景
我通常会根据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。谢谢!
您将需要
那么你可以这样做:
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 个并发请求选项。