异步管道文件到 HTTP 请求

Async piping file to an HTTP request

我正在尝试向服务器发送交错的 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,解决方案应该通过请求库——不过这种印象可能是基于误解。

根据我的评论:

Because Node is entirely non-blocking (at least when written this way) you can't be sure anything will occur in order unless you run it in series. async.series can also do this for you, or async.eachSeries.

此外,由于 Node 不等待异步活动完成,每个任务都会立即排队,而回调(事件完成事件)将以先到先得的方式发生。在您的情况下,由于 GET 请求比 POST 请求花费的时间少得多,这就是它们首先完成的原因。