【问题标题】:Async piping file to an HTTP request到 HTTP 请求的异步管道文件
【发布时间】: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


【解决方案1】:

根据我的评论:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-04
    • 2018-02-20
    • 2012-04-03
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    相关资源
    最近更新 更多