簡體   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