[英]node.js, async, restify: cannot make restify call synchronous inside async.series
我正在尝试在node.js中强制执行一些异步功能以同步执行。 我为此使用async.series。 这是我的代码:
async.series([
function(callback){
fs.truncateSync('rooms.txt', 0);
console.log("function1 done");
callback(null, 'one');
},
function(callback){
fs.truncateSync('sids.txt', 0);
console.log("start loop");
var count = 0;
async.whilst(
function () { return count <5 },
function (callback) {
count++;
sid.generateSIDs; //---> PROBLEM!!
callback();
},
function (err) {
}
);
var sids = fs.readFileSync('sids.txt').toString().split('\r\n');
console.log("function2 done");
callback(null, 'two');
},
function(callback){
//lots of asynchronous callbacks
callback(null, 'three');
}
],
function(err, results){
// results is now equal to ['one', 'two', 'three']
});
上面的代码中的所有工作都按预期(顺序)进行。 但是,当我添加这一行时, sid.generateSIDs;
,标记为“问题”,一切都折腾了! generateSIDs
是外部node.js文件sid.js
。 它使用restify异步发布几个HTTP GET。 这是sid.js
的代码:
'use strict';
var requestify = require('requestify');
var fs = require('fs');
var response = "";
var sessionId="";
function generateSIDs() {
//Request 1: Send Protocol Upgrade Request
response = "";
sessionId="";
requestify.request('http://url.com', {
method: 'GET',
headers: {
'Host': 'given',
'Connection': 'keep-alive',
'Origin': 'given',
'Referer': 'given'
},
cookies: {
'Cookie': 'given'
},
dataType: 'json'
})
.then(function(response) {
// get the response body
response = response.getBody();
sessionId = "extracted from response";
//Request 2: Set up the session
requestify.request('url.com'+sessionId, {
method: 'GET',
headers: {
'Host': 'given',
'Connection': 'keep-alive',
'Origin': 'given',
'Referer': 'given'
},
cookies: {
'Cookie': 'given'
},
dataType: 'json'
})
.then(function(response) {
fs.appendFile('sids.txt', sessionId+'\r\n', function (err) {
if (err) return console.tag("SERVER").log("file not opening: "+err);
});
console.log("file write done");
});
});
};
exports.generateSIDs = generateSIDs();
从async.series()
内部, generateSIDs()
被调用一次,生成一个新的sid,然后不再进行进一步的迭代。 从console.log()
我可以看到,由于restify
调用的异步特性,在调用sid.generateSIDs()
之前,甚至在此函数的一次迭代完成之前, async.series()
的第三个function(callback)
async.series()
被触发。
但是,我希望sid.generateSIDs()
按照while循环计数顺序连续运行多次。 这些运行完成后,只有我想要第三个函数(回调)才能执行。 正如您从generateSIDs()
代码可以理解的那样,我希望在调用第三个函数之前创建多个唯一的sid。
当我使用node sid.js
从命令行(而不是循环地)单独运行sid.js时,每次运行良好并为我创建一个新的sid。
我是node.js的新手,并且在同一代码中一起处理同步和异步功能,弄乱了我的逻辑!! 你能在这里帮我吗?
我找到了可行的解决方案! 我从async.series([])
async.whilst()
循环内部删除了sid.generateSIDs()
的执行。 相反,我在sid.js
本身内部添加了async.whilst()
,局部变量是局部的。 并做了几克现在,这按预期工作! 这是我更新的代码:
更新了async.series
内部的async.series
:
},
function(callback){
fs.truncateSync('sids.txt', 0);
console.log("start loop");
var count = 0;
async.whilst(
function () { return count <5 },
function (callback) {
count++;
sid.generateSIDs(num); //---> FIXED!
callback();
},
function (err) {
}
);
console.log("function2 done");
callback(null, 'two');
},
更新了sid.js:
'use strict';
var requestify = require('requestify');
var fs = require('fs');
function genEachSIDs() {
//Request 1: Send Protocol Upgrade Request
var response = ""; //NOTE! I made this var local from global
var sessionId=""; //NOTE! I made this var local from global to avoid override of values from one instance by another
//code inside requestify.request( below is exactly same as given in the question above.
requestify.request(
//same code as above
);
}
// adding the while loop here!
module.exports generateSIDs = function generateSIDs(num){
var count=0;
async.whilst(
function () { return count <num; },
function (callback) {
count++;
genEachSIDs();
callback();
},
function (err) {
}
);
}
我删除了这一行: var sids = fs.readFileSync('sids.txt').toString().split('\\r\\n');
从第二个功能开始,因为这再次需要等待所有sid创建完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.