Nodejs从回调中获得结果

时间:2017-08-16 12:33:06

标签: javascript node.js function callback

我试着从回调方法中得到我的结果数组,数组包含我想要的所有东西,但我可以在函数之外使用它总是保持未定义的结果。我在许多网站上寻找帮助我改进它但没有结果。

var DOMParser = require('xmldom').DOMParser;
var fs = require('fs');
var Initializer = require('./Initializer');
var StaticRoomList = Initializer.getStaticRoomList(fs, DOMParser);
console.log(StaticRoomList);

openRoomListXML = function(fs, DOMParser, callback){
try{
    fs.readFile('./XML/RoomList.xml', function(e, data){
        if(e){
            callback(e);
        }
        else{
            var BuffertoXMLString = String(data);
            var XMLOutput = new DOMParser().parseFromString(BuffertoXMLString, "text/xml");
            var XMLDocument = XMLOutput.documentElement;
            callback(null, XMLDocument);
        }

    });

}
catch(fsException){
    console.log(fsException);
}
};

getStaticRoomList = function(fs, DOMParser){
openRoomListXML(fs, DOMParser, function readList(e, XMLDocument){
    if(e){
        console.log(e);
    }
    else{
        var nodeList = XMLDocument.getElementsByTagName("room");
        var arrayRoomList = [];
        for(i = 0; i < nodeList.length; i++){
            arrayRoomList.push(nodeList[i].childNodes[0].nodeValue);
        }
        return arrayRoomList;
    }
});
};


 exports.getStaticRoomList = getStaticRoomList;

2 个答案:

答案 0 :(得分:0)

getStaticRoomList不会返回任何内容,因为回调函数内的代码在函数终止后很久就会执行。您还应该为getStaticRoomList定义另一个回调函数。

所以最后,要获得数组,你会做类似

的事情
var StaticRoomList;
Initializer.getStaticRoomList(fs, DOMParser,function(result){
   StaticRoomList = result;
});

getStaticRoomList内的回调中,您只需调用getStaticRoomList

的回调函数,而不是尝试返回结果

答案 1 :(得分:0)

JS中的函数是异步的。

您必须将回调函数作为参数传递。

下面是一个例子:

    getStaticRoomList = function(fs, DOMParser, callBack){
openRoomListXML(fs, DOMParser, function readList(e, XMLDocument){
    if(e){
        console.log(e);
    }
    else{
        var nodeList = XMLDocument.getElementsByTagName("room");
        var arrayRoomList = [];
        for(i = 0; i < nodeList.length; i++){
            arrayRoomList.push(nodeList[i].childNodes[0].nodeValue);
        }
        callBack(arrayRoomList);
    }
});

getStaticRoomList(fs, DOMParser, function(error, result){
    if(error != null){
        //Deal with resul
    }
})