2015-12-29 24 views
0

我想從回調函數中獲取xml數據並將數據發送到Xml Data Class中的另一個函數。 我必須在哪裏返回要在回調函數外部使用的數據?如何從打印機中的回調函數中獲取數據

這個類是負責讀取XML文件
export class XmlData 
{ 
    private path: string; 

    constructor(path: string) { 
     this.path = path; 
    } 

    public getXml(callback: Function): void { 

     var request = new XMLHttpRequest(); 
     request.onreadystatechange = function() { 
      if ((request.readyState == 4) && (request.status < 400)) { 
       callback(request.responseXML); 
      } 
     }; 
     request.open("GET", this.path, true); 
     request.send(); 
    } 

    public callbackData(data: XmlDocument): void { 
     var xml = new XmlDocument(data); 
     var xmlData: Element = xml.documentElement; 
    } 

    public reloadXml() { 
     this.getXml(this.callbackData); 
    } 
} 

這是主要的應用程序類調用XMLDATA類
/// <reference path="XmlData.ts" />  
class App { 

    private xmldata :XmlData; 
    constructor() { 
     this.xmldata = new XmlData("xml.xml");  
    } 
    dosome(): void { 
     this.xmldata.reloadXml(); 
    } 
} 

回答

0

林我看來,它應該是這個樣子的

export class XmlData 
{ 
    private path: string; 
    private xmlData: Element; //xml data on class level 
    private listeners: Function[] = [];//array of poreccess listeners 

    constructor(path: string) { 
     this.path = path; 
    } 

    public get data(): Element { //getter of data 
     return this.xmlData; 
    } 

    public addListener(listener: Function) { 
     this.listeners.push(listener); 
    } 

    public getXml(callback: Function): void { 

     var request = new XMLHttpRequest(); 
     request.onreadystatechange = function() { 
      if ((request.readyState == 4) && (request.status < 400)) { 
       callback(request.responseXML); 
      } 
     }; 
     request.open("GET", this.path, true); 
     request.send(); 
    } 

    public callbackData(data: XmlDocument): void { 
     var xml = new XmlDocument(data); 
     this.xmlData = xml.documentElement; 

     this.listeners.forEach((it)=>it()); // when reload operation has done then invoke all listeners 
    } 

    public reloadXml() { 
     this.getXml(this.callbackData.bind(this)); // bind your callback to current object 
    } 
} 

因此,在主應用程序ÿ OU應該與它的工作是這樣

/// <reference path="XmlData.ts" />  
class App { 

    private xmldata :XmlData; 
    constructor() { 
     this.xmldata = new XmlData("xml.xml"); 
     this.xmldata.addListener(()=>this.onXmlReloaded()); // here we add some listener to xmldata loader 
    } 

    private onXmlReloaded(){ // here we process received data outside of xmldata class 
     let receivedData = this.xmldata.data; 
     //some code here 
    }   

    dosome(): void { 
     this.xmldata.reloadXml(); 
    } 
} 
+0

'this.listeners.forEach完整路徑((它)=>它());當重新加載操作完成後,調用所有偵聽器時,即時調試該行失敗,出現此錯誤:*未捕獲TypeError:無法讀取未定義的屬性'forEach'* –

+0

這是來自Visual Studio的錯誤:0x800a138f - JavaScript運行時錯誤:無法獲取的未定義或空引用 –

+0

嗯,我給你一些變化作出財產「的forEach」 –

0

我發現這個問題不是你的建議,但它看起來像

​​3210

}

public abc(data: any) { 
      console.log(data); 
} 

,如果你想獲得的存取權限在同一類的另一功能,需要指定該功能

相關問題