如何清理回调下结构中回调的源代码



例如在本例中

我想调用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);

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

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

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

合金包括下划线.js开箱即用。如果要同时运行多个异步调用,可以使用类似 http://underscorejs.org/#after

如果可以执行后续调用,则可能需要以避免回调地狱的方式组织代码。已经有很多关于解决这个问题的不同方法的文档。这是一篇旧博客文章的示例。

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

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 intint,或者扩展(例如)为每个连接提供一些特定的回调。

最新更新