Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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
如何在不知道请求数量的情况下链接Javascript ajax请求。(Nodejs)_Javascript_Node.js_Ajax - Fatal编程技术网

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

如何在不知道请求数量的情况下链接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:/

假设我需要发布项目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://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了,我也喜欢以更自然的方式(而不是请求)工作