Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js(ES6)-带有Promise.all的Promise控制流_Node.js_Request_Queue_Promise_Es6 Promise - Fatal编程技术网

Node.js(ES6)-带有Promise.all的Promise控制流

Node.js(ES6)-带有Promise.all的Promise控制流,node.js,request,queue,promise,es6-promise,Node.js,Request,Queue,Promise,Es6 Promise,我正在尝试创建一个处理并行HTTP请求的队列 为每个HTTP请求生成一个请求对象,例如 { method: 'POST', uri: 'http://posttestserver.com/post.php', body: { some: 'foo' }, json: true } 我传入这些对象的数组,并希望将它们添加到队列中,然后执行实际请求 问题:Promise.all语句在返回之前等待所有请求完成 问题:我希望将所有任务添加到队列中

我正在尝试创建一个处理并行HTTP请求的队列

为每个HTTP请求生成一个请求对象,例如

{
    method: 'POST',
    uri: 'http://posttestserver.com/post.php',
    body: {
        some: 'foo'
    },
    json: true
}
我传入这些对象的数组,并希望将它们添加到队列中,然后执行实际请求

问题:Promise.all语句在返回之前等待所有请求完成

问题:我希望将所有任务添加到队列中,并在每个请求完成后返回,而不是等待它们全部完成。有人能建议如何将发出请求的逻辑与将任务添加到队列中的逻辑分开吗

注意:承诺队列和请求承诺都是返回承诺

以下是我所拥有的:

"use strict";

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

Promise.all(options.map(function(task) {
        return queue.add(function() {
            return rp(task);
        })
    }))
    .then(function(response) {
        log(response);
    })
    .catch(function(err) {
        log(err);
    });


function log(data) {
    console.log(JSON.stringify(data, undefined, 4));
}

我建议在forEach循环中调用承诺链,如下所示:

var queueTask=函数(任务){
//回报承诺
return queue.add(函数(){return rp(task);});
};
var logResponse=函数(响应){
控制台日志(响应);
};
var catchErrors=函数(err){
控制台日志(err);
};
options.forEach(opt=>{
queueTask()
。然后(logResponse)
.捕捉(捕捉错误);

})
尝试使用Promise.race([p1,p2],callback)从承诺列表中获取结果。我的错误是,Promise.race只从第一个“重新爱上”的承诺中获取结果。我正在努力解决“每个请求完成后返回”的问题。谢谢@dwhieb-这很理想,确实非常有用@Ben-Note,如果你想知道的话,这不会让你知道最后一项任务何时完成。这就是
Promise.all()
的作用。@jfriend00-这是一个很好的观点。在这种情况下,这不是一个要求,但感谢您的评论。我还不知道我会怎么做。将对此进行进一步思考;)