0

我正在尝试将交错的 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,并且解决方案应该通过请求库来解决——这种印象可能是基于一种误解。

4

1 回答 1

0

根据我的评论:

因为 Node 完全是非阻塞的(至少在以这种方式编写时),除非您连续运行它,否则您无法确定任何事情都会按顺序发生。async.series也可以为您执行此操作,或async.eachSeries.

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

于 2015-07-24T17:58:54.187 回答