【发布时间】:2015-07-24 16:43:41
【问题描述】:
我正在尝试向服务器发送交错的 GET 和 POST 请求,但 POST 请求正在从文件发送数据,这似乎会影响时间。
var async = require('async');
var http = require('http');
var request = require('request');
var fs = require('fs');
var arr = [];
for (var i = 1; i <= 50; i++) {
arr.push(i);
}
var limitedAgent = new http.Agent({maxSockets: 6});
function processThenSendRequest(data, onfinish) {
request.get({
url: 'http://www.google.com',
pool: limitedAgent
}, (function(j) {
return function(err, res) {
console.log("GET: response from " + j);
};
})(data)).on('socket', (function(j) {
return function(socket) {
console.log("GET: socket assigned for " + j);
}
})(data));
var source = fs.createReadStream('README.md');
var postReq = request.post({
url: 'http://www.google.com',
pool: limitedAgent
}, (function(j) {
return function(err, res) {
console.log("POST: response from " + j);
};
})(data)).on('socket', (function(j) {
return function(socket) {
console.log("POST: socket assigned for " + j);
}
})(data));
// source.pipe(postReq);
setTimeout(function() {
onfinish(null, data);
}, 10000);
}
async.map(arr, processThenSendRequest, function(err, results) {
if (err) console.error(err);
console.log("finished");
});
上面编写的代码运行良好,GET 和 POST 请求以交替顺序发送,但如果我取消注释 source.pipe(postReq) 行,那么所有 GET 请求都会在所有 POST 请求之前发送。
这个问题有解决办法吗?我可以使用async.mapLimit,但这感觉像是一个hack,解决方案应该是通过请求库——不过这种印象可能是基于一种误解。
【问题讨论】:
-
因为 Node 完全是非阻塞的(至少在以这种方式编写时),除非您连续运行它,否则您无法确定任何事情都会按顺序发生。
async.series也可以为您执行此操作,或async.eachSeries。 -
这无关,但是
processThenSendRequest中绑定data的额外闭包是不必要的,因为data的范围已经限定为processThenSendRequest,并且该调用不会更改该值。 -
@mscdex 感谢您指出这一点 - 这是有道理的,对我很有帮助。
-
@remus 明白了——这很有道理。在这种情况下,我将使用
async.mapLimit来完成我正在做的事情,因为我不需要它完全串联,但您的评论有助于澄清我的情况。
标签: node.js asynchronous stream npm-request