以下是我的代码
var request = require("request");
$('.xxx').siblings().each(function(i, elem) {
if (i === $('.xxx').siblings().length - 1) {
goToOrderDetail(true, i);
}
});
function goToOrderDetail(status, i) {
console.log('Processing' + i + 'data!');
var options = {
method: "POST",
url: "https://example.com"
}
request(options, function(error, response, body) {
console.log(response);
}
}
当我在node.js上运行此文件时,我会在终端中收到如下信息。
Processing 1 data!
Processing 2 data!
Processing 3 data!
Processing 4 data!
Processing 5 data!
response message
response message
response message
response message
response message
但我期望和想要的是
Processing 1 data!
response message
Processing 2 data!
response message
Processing 3 data!
response message
Processing 4 data!
response message
Processing 5 data!
response message
我知道这是关于同步或异步问题,但我该如何解决?
如何等待goToOrderDetail函数完成然后保持循环下一个元素?
我确实找过async(enter link description here)包,但不知道我可以使用哪个函数。
答案 0 :(得分:0)
因为函数goToOrderDetail
返回了一个承诺,
试试这个
将您的函数goToOrderDetail
更新为
function goToOrderDetail(status, i) {
var options = {
method: "POST",
url: "https://example.com"
}
request(options, function(error, response, body) {
console.log('Processing' + i + 'data!');
console.log("test");
}
}
答案 1 :(得分:0)
您的代码运行良好,但您的console.log
并不代表正在发生的事情。
如果你移动你的console.log
var options = {
method: "POST",
url: "https://example.com"
}
request(options, function(error, response, body) {
console.log('Processing' + i + 'data!');
console.log("test");
}
你会得到
Processing 1 data!
test
Processing 2 data!
test
Processing 3 data!
test
Processing 4 data!
test
Processing 5 data!
test
答案 2 :(得分:0)
目前还不是很清楚你想做什么,甚至你的功能如何被你放在那里的if(i === ...)
多次调用。真正确保以同步方式调用请求的一种方法是“链接”它们。它有一个额外的好处,可以更明确地说明你的意图......
以下(未经测试)代码说明了我的意思。请记住,您将失去运行并行请求的好处。
var request = require("request");
var numberOfRequests = $(".xxx").length;
function goToOrderDetail(status, index, maximum) {
console.log('Preparing' + index + 'th request!');
var options = {
method: "POST",
url: "https://example.com"
}
request(options, function(error, response, body) {
console.log("received " + index +"th request response : ");
console.log(response);
//here, the request is done. maybe we want to launch another one
if(index < maximum )
goToOrderDetail(status, index +1, maximum);
}
}
//call the function once, for the first request, and let the chaining happen
goToOrderDetail(true, 1, numberOfRequests);