繁体   English   中英

node.js,async,restify:无法在async.series内部使restify调用同步

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM