Promise.all提供并发请求,但是Promise的并发请求要等到所有的请求都结束了才会返回结果,但是很多时候,我们希望实时的获取返回的结果,Promise.all就显得力不从心了,所以,可以改造方法,用Promise链来调用的模式
const Queue = require("promise-queue");
const rp = require('request-promise');
const maxConcurrent = 10;
const maxQueue = Infinity;
const queue = new Queue(maxConcurrent, maxQueue);
var options = [
{
method: 'POST',
uri: 'http://posttestserver.com/post.php',
body: {
some: 'foo'
},
json: true
},{
method: 'POST',
uri: 'http://posttestserver.com/post.php',
body: {
some: 'bar'
},
json: true
}
];
var runTasks = new Promise(function(resolve, reject) {
var queueTask = function(task) {
// returns a promise
return queue.add(function() { return rp(task); });
};
var logResponse = function(response) {
console.log(response);
};
var catchErrors = function(err) {
console.log(err);
};
options.forEach((opt, i, arr) => {
queueTask()
.then(logResponse)
.catch(catchErrors);
if (i === arr.length-1) { resolve(); }
});
});
var functionToRunWhenLastTaskCompletes = function() {
console.log('All tasks are complete.');
};
// runTasks is a promise here, not a function
// so you don't need to call it like a function
runTasks
.then(functionToRunWhenLastTaskCompletes)
给出这个办法的出处