Javascript 如何在node.js中异步执行多个REST API请求?

Javascript 如何在node.js中异步执行多个REST API请求?,javascript,node.js,async.js,Javascript,Node.js,Async.js,我要做的是执行多个远程RESTAPI请求,其中我希望每个请求都按顺序一个接一个地执行。我读到async.js就是这样做的 由于我不知道需要执行多少次请求,所以我使用了async.while()。这个想法是,一旦API返回零个POST,我将停止请求。这是我到目前为止的代码(出于测试目的,我限制循环只运行5次) 测试输出如下所示: Iterating, i= 1 Iterating, i= 2 Iterating, i= 3 Iterating, i= 4 Iterating, i= 5 http:

我要做的是执行多个远程RESTAPI请求,其中我希望每个请求都按顺序一个接一个地执行。我读到async.js就是这样做的

由于我不知道需要执行多少次请求,所以我使用了
async.while()
。这个想法是,一旦API返回零个POST,我将停止请求。这是我到目前为止的代码(出于测试目的,我限制循环只运行5次)

测试输出如下所示:

Iterating, i= 1
Iterating, i= 2
Iterating, i= 3
Iterating, i= 4
Iterating, i= 5
http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=api-key-here&offset=80
Request #5 done
http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=api-key-here&offset=80
Request #5 done
http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=api-key-here&offset=80
Request #5 done
http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=api-key-here&offset=80
Request #5 done
http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=api-key-here&offset=80
Request #5 done

request
方法只考虑了最终的
i
值80。我做错了什么,如何解决这个问题?

问题的出现是因为您的
reqURL
变量没有
var
,并且不属于
dothisineverytime
范围。您还可以同时发出所有请求,因为在调用
next
之前,您不会等待请求完成。这两件事导致请求在同一URL上同时发生五次。请尝试以下操作:

function doThisEveryTime(next) {
    var reqURL = 'http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=' + APIKEY + '&offset=' + i*20;  

    request(reqURL, function (err, resp, body) {
        if (!err && resp.statusCode === 200) {
            var resultAsJSON = JSON.parse(body);      
            console.log(reqURL);        
            console.log("Request #" + i + " done");
        }

        i += 1;

        if (i === 5) {
            continueWhilst = false;
        }

        console.log("Iterating, i= " + i);

        // This is in the callback for request now.
        next();
    });
}
function doThisEveryTime(next) {
    var reqURL = 'http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=' + APIKEY + '&offset=' + i*20;  

    request(reqURL, function (err, resp, body) {
        if (!err && resp.statusCode === 200) {
            var resultAsJSON = JSON.parse(body);      
            console.log(reqURL);        
            console.log("Request #" + i + " done");
        }

        i += 1;

        if (i === 5) {
            continueWhilst = false;
        }

        console.log("Iterating, i= " + i);

        // This is in the callback for request now.
        next();
    });
}