インターリーブされた 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
ましたが、それはハックのように感じられ、解決策はリクエスト ライブラリを使用する必要があります。この印象は誤解に基づいている可能性があります。