如何在不知道请求数量的情况下链接Javascript Ajax请求。 (的NodeJS)

比方说,我需要POST的item1,然后等待一个响应,然后POST的item2等,但我不知道的项目数,我只知道他们需要按顺序。

for(item in array){ request({ uri: 'http://some.url/', method: 'POST', data: item }, function(clbck){ <request with data item2 and so on> }) } 

等到请求(n)没有完成。

如何连接请求而不知道数量?

这个问题的解决scheme是惊人的asynchronous/等待function。 但是我在callback中使用它们,这是我需要初始化的。

 // init a async function const post_message = async (id, array) => { // init loop of requests for(let iter = 0; iter<array.length; iter++){ // lets wait for promise to resolve or reject (no need to return anything) await new Promise(function(resolve,reject){ request({ uri: 'my_post_url', method: 'POST', json: {data: my_data} },function(error,response,body){ if(error) { reject('REJECTED') } else { resolve('RESOLVED') } }) }) } } 

我们可以链接(等待)请求去一个接一个,这里的关键是等待查找解决或拒绝(然后,捕获)的promice,等待不关心callback或返回或try / catch方法。 ..

通过callback:

 const makeRequest = (item, cb) => request({ uri: 'http://some.url/', method: 'POST', data: item }, cb); // 1. reverse() so that we can start building the callback chain from the end // 2. Build up callback chain (starting with no-op function passed in as initial state // to reduce) by returning a function which calls makeRequest() with the current item // and passes the existing chain of callbacks to be called after that request finishes const callbackChain = array.reverse().reduce((chain, item) => { return () => makeRequest(item, chain); }, () => {}); callbackChain(); 

有了promise(需要一个promise的返回版本):

 let promise = Promise.resolve(); // You can always attach more .then callbacks to an existing promise for (let item of array) { promise = promise.then(() => request({ uri: 'http://some.url/', method: 'POST', data: item })); } 

或者与Array#reduce

 const promise = array.reduce((promise, item) => { return promise.then(() => request({ uri: 'http://some.url/', method: 'POST', data: item })); }, Promise.resolve()); 

你甚至不需要承诺/asynchronous等待或其他库:

 function do(item) { request({ uri: 'http://some.url/', method: 'POST', data: item }, () => { let nextElement = array.shift(); if (nextElement) { do(nextElement); } else { // all done } }); } do(array.shift()); 

或者,如果你想要一点清洁, async.eachSeries将是一个很好的解决scheme