2017-02-06 51 views
0

我想在兩個http調用完成後調用一個函數。可以自己做事件/回調嗎? javascript

所以我需要等到兩個http調用完成。

此代碼是鈦,但結構是類似於javascript的語言的常見結構。

我做了一些代碼,現在,,,但是我不知道如何處理原來的回調....

var flg1 = false; 
var flg2 = false; 

function(callback if (flg1 && flg2)){console.log"Now two flg is changedd!!!";} 


// first http call 
var pram={}; 
var url = "http://myapiserver.com/api/test"; 
var client = Ti.Network.createHTTPClient({ 
    onload : function(e) { 
     Ti.API.info("first call is success!!"); 
      flg1 = true; //change flg to true 
      }); 
    }, 
    timeout : 3000 
}); 

client.open("GET", url); 
client.setRequestHeader('Content-type','charset=utf-8'); 
client.send(pram); 


// second http call 
var pram2={}; 
var url2 = "http://myapiserver.com/api/test2"; 
var client2 = Ti.Network.createHTTPClient({ 
    onload : function(e) { 
     Ti.API.info("second call is success!!"); 
        flg2 = true; //change flg to true 
      }); 
    }, 
    timeout : 3000 
}); 

client2.open("GET", url); 
client2.setRequestHeader('Content-type','charset=utf-8'); 
client2.send(pram2); 

回答

1

我不熟悉的鈦,但我認爲它支持promises你應該嘗試使用Promise.all()方法在兩個調用結束時執行某些操作。

無論哪種方式,你可以在你的承諾包一切,因爲這樣的:

var p1 = new Promise(function (resolve, reject) { 
    var pram={}; 
    var url = "http://myapiserver.com/api/test"; 
    var client = Ti.Network.createHTTPClient({ 
     onload : function(e) { 
      // extract data from e, 
      data = e 
      resolve(data) 
     }, 
     onerror: function (error) { 
      reject(error) 
     }, 
     timeout : 3000 
    }); 

    client.open("GET", url); 
    client.setRequestHeader('Content-type','charset=utf-8'); 
    client.send(pram); 
}) 


// second http call 
var p2 = new Promise(function (resolve, reject) { 
    var pram2={}; 
    var url2 = "http://myapiserver.com/api/test2"; 
    var client2 = Ti.Network.createHTTPClient({ 
     onload : function(e) { 
      // extract data from e, 
      data = e 
      resolve(data) 
     }, 
     onerror: function (error) { 
      reject(error) 
     }, 
     timeout : 3000 
    }); 

    client2.open("GET", url); 
    client2.setRequestHeader('Content-type','charset=utf-8'); 
    client2.send(pram2); 
} 

Promise.all([p1, p2]).then(function (dataComingFromP1, dataComingFromP2) { 
    // magik 
}) 

如果您需要填充工具作爲承諾他們不通過鈦默認支持(再次,我不是一個鈦用戶),您可以使用npm上的很多庫。

+0

非常感謝。不知何故來自p1的數據和來自p2的數據被添加到dataComingFromP1中(dataComingFromP2未定義)。但是我認爲這是另一個問題。感謝您的建議。 – whitebear

+0

我糾正了這個例子。在第二個承諾中沒有呼籲「解決」。無論如何,請查看手冊以瞭解承諾如何工作! – motanelu

相關問題