[英]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.