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