最后一个函数在循环中完成后如何运行函数?

时间:2017-02-06 12:25:37

标签: javascript node.js promise

以下是我的代码

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)包,但不知道我可以使用哪个函数。

3 个答案:

答案 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);