如何在不知道请求数量的情况下链接Javascript ajax请求。(Nodejs)
假设我需要发布项目1,然后等待响应,然后发布项目2等等,但我不知道项目的数量,我只知道它们需要有序如何在不知道请求数量的情况下链接Javascript ajax请求。(Nodejs),javascript,node.js,ajax,Javascript,Node.js,Ajax,假设我需要发布项目1,然后等待响应,然后发布项目2等等,但我不知道项目的数量,我只知道它们需要有序 for(item in array){ request({ uri: 'http://some.url/', method: 'POST', data: item }, function(clbck){ <request with data item2 and so on> }) } for(数组中的项){ 请求({ uri:'http:/
for(item in array){
request({
uri: 'http://some.url/',
method: 'POST',
data: item
}, function(clbck){
<request with data item2 and so on>
})
}
for(数组中的项){
请求({
uri:'http://some.url/',
方法:“POST”,
数据:项目
},功能(clbck){
})
}
依此类推,直到请求(n)未完成
如何在不知道请求数量的情况下链接请求?这个问题的解决方案是一个惊人的异步/等待函数。但我在回调中使用了它们,我需要对它们进行初步的分析
// 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')
}
})
})
}
}
//初始化异步函数
const post_message=async(id,数组)=>{
//请求的初始化循环
对于(让iter=0;iter与回调:
constmakerequest=(项,cb)=>request({
uri:'http://some.url/',
方法:“POST”,
数据:项目
},cb);
//1.reverse(),这样我们就可以从末尾开始构建回调链
//2.建立回调链(从没有作为初始状态传入op函数开始
//通过返回一个使用当前项调用makeRequest()的函数来减少
//并在请求完成后传递要调用的现有回调链
const callbackChain=array.reverse().reduce((链,项)=>{
return()=>makeRequest(项目、链);
}, () => {});
callbackChain();
带有承诺(需要返回承诺版本的请求
):
let promise=promise.resolve();
//您始终可以附加更多。然后回调现有承诺
for(数组的let项){
承诺=承诺。然后(()=>请求({
uri:'http://some.url/',
方法:“POST”,
数据:项目
}));
}
或者使用数组#reduce
:
const promise=array.reduce((promise,item)=>{
返回承诺。然后(()=>请求({
uri:'http://some.url/',
方法:“POST”,
数据:项目
}));
},Promise.resolve());
您甚至不需要Promissions/async await或其他库:
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());
或者,如果你想让它更干净一点,这将是一个很好的解决方案一个选项:承诺。这里有一个帮助方法:但是如何链接它们?@ram这个蓝鸟文档页面有一些例子:注意,reducer函数应该返回一个承诺,如果请求不应该按顺序执行,你也可以使用一个承诺。每个
帮助r、 另一个选项是async.js,它为异步工作提供了许多流控制选项。@Paul谢谢,我已经看过async.js和bluebird.js了,我也喜欢以更自然的方式(而不是请求)工作