自己做event/callback可以吗? javascript

Is it possible to make event/callback by myself? javascript

我想在两个 http 调用完成后调用一个函数。

所以我需要等到两个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);

我不熟悉 Titanium,但我认为它支持 promises and you should try to use the Promise.all() 方法在两个调用都结束时执行某些操作。

无论哪种方式,您都可以自己将所有内容包装在 promise 中,例如:

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 Promises,因为默认情况下 Titanium 不支持它们(同样,我不是 Titanium 用户),npm 上有很多库可供您使用。