2017-09-01 333 views
0

我使用请求库通过API与其他服务器进行通信。但是现在我需要同时发送多个(10个或更多)POST请求,并且只有在所有响应都是正确的情况下才能进一步移动。通常语法看起来有点像这样:Node.js请求 - 处理多个POST请求

var options = { 
url: "", 
method: "POST", 
header: {...}, 
body: {...} 
}; 

request(options, function(err,response,body) 
{ 
} 

但是现在我有一个对象数组而不是单个选项变量。有没有办法做到这一点?或者也许有另一个图书馆能够处理这个问题。

编辑:

var arrayOfIds = []; 
const requests = []; 
for(var i in range){ 
    var options = {} // here goes all bodies and headers to send 
    requests.push(// push a request to array dynamically 
    request(options, function(err,response,body){ 
    if(!err && response.statusCode == 201){ 
     arrayOfIds.push(body.id); 
    } 
    })); 

Promise.all(requests) 
.then(function(res){ 
    console.log(arrayOfIds); // this is empty 
}); 
+0

可能的复制(https://stackoverflow.com/questions/44636542/loop-through-asynchronous-request) –

回答

1

有几种方法来解决这个问题:

  • 异步库,方法并行
  • Promise.all

要切换您的要求的承诺,另外使用request模块 - request-promise 。在代码它看起来像这样:的[循环通过异步请求]

const request = require('request-promise'); 

// Note, you don't assign callback here 
const promises = [ 
    request.post({...}), 
    request.post({...}), 
    request.post({...}) 
]; 

// And then you simply do Promise.all 
Promise.all(promises).then(console.log); 
+0

感谢。这非常有帮助。而如果我不知道确切的请求数量?我应该使用常规循环来完成const promises数组吗? – Jacek717

+0

只需动态填充它们,这不是问题。 – Lazyexpert

+0

最后一个问题:所有这些请求都应该发回给我一个我刚刚在另一台服务器上创建的对象的ID。我创建了一个ID数组,并试图填充它,如果一切都正确,则推送一个body.id值。然而,它不起作用,Promise.all后我只得到一个空数组。你知道如何解决它吗?我编辑了我的初始代码以向您展示所有内容 – Jacek717