2013-10-18 83 views
1

我正在使用Titanium SDK開發一個小型Android應用程序,該應用程序與遠程PHP文件進行交互以檢索其數據。 FOR循環在HTTPClient返回任何數據之前執行,因此'myTest'爲空,並且沒有任何內容添加到'tblListing'中。Titanium,等待HTTPClient回覆

function jsonPOST(inAction, inParams) { // jsonPOST is a global function 
    var xhr = Ti.Network.createHTTPClient({ 
     onload : function(e) { 
      Ti.API.info("Received text: " + this.responseText); 
      return this.responseText; 
     }, 
     onerror : function(e) { 
      Ti.API.debug(e.error); 
      alert('error'); 
      return false; 
     }, 
     timeout : 8000, // in milliseconds 
    }); 

    var sendData = { 
     'action' : inAction, 
     'json' : JSON.stringify(inParams) 
    }; 

    xhr.open('POST', "http://domain.com/file.php"); // url redacted 
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
    xhr.send(sendData); 
} // end. jsonPOST() 

var myTest = jsonPOST('getlisting'); // only need to pass first param in this instance 
for (i in myTest) { 
    tblListing.appendRow({ title: myTest[i].title, id: myTest[i].id }); 
} 

沒有延遲執行其他任何東西在同一個線程上,我怎麼能讓FOR循環等待直到數據被HTTPClient返回? 'jsonPOST'函數用於檢索應用程序中多個元素的各種數據,並應保持動態。

回答

2

我結束了使用回調參數來允許一旦函數被HTTPClient接收到數據被調用。這使得jsonPOST功能保持動態。

function jsonPOST(inAction, inParams, inCallback) { 

     var xhr = Ti.Network.createHTTPClient({ 
      onload : function(e) { 
       Ti.API.info("Received text: " + this.responseText); 
       var reply = JSON.parse(this.responseText); 
       inCallback(reply); 
      }, 
      onerror : function(e) { 
       Ti.API.debug(e.error); 
       alert('error'); 

       return false; 
      }, 
      timeout : 8000, // in milliseconds 
     }); 

     var sendData = { 
      'action' : inAction, 
      'json' : JSON.stringify(inParams) 
     }; 
     xhr.open('POST', "http://domain.com/file.php"); // url redacted 
     xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
     xhr.send(sendData); 
    } 

function processListing(inJson) { 
    for (i in inJson) { 
     tblListing.appendRow({ 
      title : inJson[i].listingTitle, 
      id : inJson[i].listingID 
     }); 
    } 
} 

jsonPOST('getListing', null, processListing); 
0

循環需要在綁定到XHR對象的onload屬性的函數:

function jsonPOST(inAction, inParams) { // jsonPOST is a global function 
    var xhr = Ti.Network.createHTTPClient({ 
     onload : function(e) { 
      Ti.API.info("Received text: " + this.responseText); 
      for (i in this.responseText) { 
       tblListing.appendRow({ title: myTest[i].title, id: myTest[i].id }); 
      } 
      return this.responseText; 
     }, 
     onerror : function(e) { 
      Ti.API.debug(e.error); 
      alert('error'); 
      return false; 
     }, 
     timeout : 8000, // in milliseconds 
    }); 

    var sendData = { 
     'action' : inAction, 
     'json' : JSON.stringify(inParams) 
    }; 

    xhr.open('POST', "http://domain.com/file.php"); // url redacted 
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
    xhr.send(sendData); 
} // end. jsonPOST() 

var myTest = jsonPOST('getlisting'); // only need to pass first param in this instance 

注意,HttpClient的工作ansynchronous。它發送請求並等待數據,但同時調用腳本繼續執行。