如何在回调下一个结构

时间:2017-01-26 07:13:52

标签: javascript titanium

例如在这种情况下

我想调用url1,调用url2,调用url3; ,等待上次回拨后一步一步。

例如,这是我的源代码

var pram={};
var url = "http://myapiserver.com/api/test";
var client = Ti.Network.createHTTPClient({
    onload : function(e) {
        Ti.API.info("first call is success!!");   
      var url2 = "http://myapiserver.com/api/test2";
       var client2 = Ti.Network.createHTTPClient({
           onload : function(e) {
              // call URL 3 here!!
              Ti.API.info("second call is success!!");
          },timeout : 3000
       });
        client2.open("GET", url);
        client2.setRequestHeader('Content-type','charset=utf-8');
        client2.send(pram2);
    },
    timeout : 3000
});

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

这个源代码是可以的,但是,如果你需要更多的步骤,嵌套结构将越来越深,难以维护。

有没有很好的方法来清理这种源代码?

3 个答案:

答案 0 :(得分:2)

您应该利用CommonJS格式来获得一个接收参数和回调的http.js文件。这应该避免一遍又一遍地重复创建HTTPClient对象。

合金包含underscore.js开箱即用。如果您想同时运行多个异步调用,可以使用http://underscorejs.org/#after

之类的内容

如果您可以进行后续调用,您可能希望以避免回调地狱的方式对代码进行组织。已经有很多关于解决这个问题的不同方法的文档。这是旧帖子的Sample

答案 1 :(得分:0)

您可以尝试以下操作。它易读且易于维护。

var createClients = function (connections) {
    var connection = connections.shift(),
        url = connection['url'],
        param = connection['param'],
        client = Ti.Network.createHTTPClient({
            onload: function (e) {
                Ti.API.info("Call is success!");
                connections[0] && createClients(connections)
            },
            timeout: 3000
        });
    client.open("GET", url);
    client.setRequestHeader('Content-type','charset=utf-8');
    client.send(param);
};

var connections = [
    {'url': "http://myapiserver.com/api/test1", 'param': {}},
    {'url': "http://myapiserver.com/api/test2", 'param': {}},
    {'url': "http://myapiserver.com/api/test3", 'param': {}}
];

createClients(connections);

请注意,您最终会以空connections

结束

此外,您可以使用connections为每个连接获取HTTPClient的内容,或者扩展(例如)每个连接的某些特定回调。

答案 2 :(得分:-1)

我猜您正在寻找清理代码的工具,this tool效果非常好。