2017-08-16 118 views
0

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

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; 
+0

* “我tryna” * = “我想”。 –

+0

'getStaticRoomList'不返回任何东西 – George

+0

我期望这是https://stackoverflow.com/questions/14220321的另一个重复 - 但它真的不清楚你说的是什么函数,什么值是未定义的。 – Quentin

回答

0

getStaticRoomList由于功能被终止后的回调函数中的代码执行长不返回任何内容。您还应该为getStaticRoomList定义另一个回调函数。

所以在最后,获得数组,你会做这样的事情

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

而且在里面getStaticRoomList回调,而不是试图返回的结果,您只需拨打的getStaticRoomList

回调函数
+0

即使使用它StaticRoomList保持未定义的功能,并保持良好的内部。 – Aupedeus

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 
    } 
})