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

4

1 に答える 1

0

私のコメントによると:

Node は完全に非ブロッキングであるため (少なくともこのように記述されている場合)、連続して実行しない限り、順番に何かが発生することを確認することはできません。async.seriesまたは、これを行うこともできますasync.eachSeries

さらに、Node は非同期アクティビティの終了を待たないため、各タスクはすぐにキューに入れられますが、コールバック (イベント完了イベント) は先着順で発生します。あなたの場合、GET リクエストは POST リクエストよりもはるかに時間がかからないため、最初に完了するのはそのためです。

于 2015-07-24T17:58:54.187 に答える