2017-02-06 8 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 
}) 

Если вам нужно polyfill Обещания, как они не поддерживаются Titanium по умолчанию (опять же, я не Titanium пользователь), есть много библиотек на npm, которые вы можете использовать.

+0

спасибо. как-то данные из p1 и данные из p2 добавляются в dataComingFromP1 (dataComingFromP2 не определено). Однако я думаю, что это еще одна проблема. спасибо за ваше предложение. – whitebear

+0

Я скорректировал пример. Во втором обещании не было вызова «разрешить». В любом случае, изучите руководство, чтобы понять, как работают обещания! – motanelu