我有以下代码与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
如何解决问题,以便在主要C
和a
之后打印b
?
答案 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()
中实现更复杂的队列管理。