2017-08-16 108 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 
    } 
})