为什么Node.js不执行回调函数?

时间:2014-05-25 11:50:08

标签: node.js

我有以下代码与http模块:

function PostCode(stream) {
    // Build the post string from an object
    console.log("Start upload: " + stream);
    console.log("A");
    var post_data = JSON.stringify({
        'stream' : stream,
    });
    console.log("B");
    // An object of options to indicate where to post to
    var post_options = {
        'host': 'myserver',
        'port': '5000',
        'path': '/upload',
        'method': 'POST',
        'headers': {
            'Content-Type': 'application/json'
        }
    };
    // Set up the request
    console.log("C");
    var post_req = http.request(post_options, function(res) {
        console.log("D");
        res.setEncoding('utf8');
        console.log(post_options);
        res.on('data', function (chunk) {
            console.log('Response: ' + chunk);
        });
    });

    // post the data
    post_req.write(post_data,'utf8');
    post_req.end();

}

我执行postCode函数1000次以备份我的文件系统。

问题是没有执行回调,我看到序列输出:

A
B
C
A
B
C 

等等..没有D

就在执行所有postCode时,回调开始运行。

我如何平行回调并行?那么D也会打印出来吗?

修改

这是一个新问题,希望清楚。我仍然不明白如何解决这个问题:

问题是我有一个调用函数A的循环。

在这个函数中,有一个代码块可以执行带回调的函数,假设回调是B

现在,B调用其他函数C

含义:

`function main(){
   for (int i = 0; i<5; i++){
        console.log("main" + i);
        A();
   }
}

function A(){
   // do some stuff
   var u = http.request(o, function (res){
        console.log("A" + i);
        B();
   })
}

function B(){
   //do some stuff
      var u = http.request(o, function (res){
        console.log("B" + i);
        C();
   })
}


function C(){
        console.log("C" + i);

}

我看到C()回调正在等待所有A循环完成,然后才执行。 在这种情况下,我会看到:

main 0
A 0
B 0 
main 1
A 1
B 1 
main 2
A 2
B 2 
main 3
A 3
B 3 
main 4
A 4
B 4
C 0
C 1
C 2
C 3
C 4

如何解决问题,以便在主要Ca之后打印b

1 个答案:

答案 0 :(得分:0)

您的代码错过了调用PostCode()的部分,但它可能类似于for循环。正如您已经发现的那样,只会填充事件队列,只有在没有其他代码运行时才会执行该事件队列。

您可以尝试这样的事情:

function postNextStream() {
  if (streams.length > 0)
    PostCode(streams.shift());
}

var streams = [];

for (*however you find the stuff you'd like to post*)
  streams.push(stream);

postNextStream();

然后在http.request()返回的ClientRequset上为“end”事件设置一个侦听器,并从那里调用postNextStream()

这会顺序执行所有请求。如果您想要某种并行性,则必须在postNextStream()中实现更复杂的队列管理。