异步管道文件到HTTP请求

时间:2015-07-24 16:43:41

标签: node.js asynchronous stream npm-request

我试图将交叉的GET和POST请求发送到服务器,但是POST请求正在从文件发送数据,这似乎会破坏时间。

<TextView
 ...
 android:padding="5dp"/>

上面编写的代码运行正常,GET和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"); }); 行,则在所有POST请求之前发送所有GET请求。

这个问题有解决方案吗?我可以使用source.pipe(postReq),但这感觉就像一个黑客,解决方案应该通过请求库 - 但这种印象可能基于误解。

1 个答案:

答案 0 :(得分:0)

根据我的评论:

  

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

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