我的代码运行良好,但我一点也不喜欢。
我想将一个文件拆分为两个文件,一个包含webServices,另一个包含控制器。
我的文件是这样做的:
文件:Validation.js(控制器)
// Load next view
var MainView = Alloy.createController('index').getView('tabGroup');
// this a function call when I click a button "validar" on Validación View.
function btnClick(){
var url = 'www.cocoloco.com/whatever';
var webService = Ti.Network.createHTTPClient({
onload: function(e){
// open new view
MainView.open();
// close actual view
$.tabValidacion.close();
$.tabValidacion = null;
},
onerror: function(e){
alert('onerror: ' + e.error);
},
timeout: 5000
});
webService.open('POST', url);
webService.send();
}
但我想在下面做这样的事情(分为两个文件:webServices.js-库-和validation.js-控制器-)。
问题是,我总是收到消息"error",因为我通过了t"success=webServices.procol();",但就"异步"而言,它并没有停止,而是在没有服务器回答的情况下转到下面的代码行。
文件:webServices.js(库)
exports.protocol = function(){
var url = 'www.cocoloco.com/whatever';
var webService = Ti.Network.createHTTPClient({
onload: function(e){
// on sucess exit with true
return(true);
},
onerror: function(e){
alert('onerror: ' + e.error);
// on sucess exit with false
return(false);
},
timeout: 5000
});
webService.open('POST', url);
webService.send();
}
文件:Validation.js(控制器)
// Load next view
var MainView = Alloy.createController('index').getView('tabGroup');
function btnClick(){
var webServices = require('webServices');
var success = webServices.protocol();
if(success){
// open new view
MainView.open();
// close actual view
$.tabValidacion.close();
$.tabValidacion = null;
}else{
alert('error');
}
}
我考虑了两种可能的选择:
使用promise。
在"success"上激发一个新事件,并使用该事件运行另一个回调函数(在该函数中,我打开新视图并关闭上一个视图)。
我不知道这有多困难,因为事件是一个文件(库),而回调函数是另一个(控制器)
我从来没有使用过这些解决方案,所以我不知道它们有多"好"。
有什么建议吗?
回调方法在大多数情况下都能很好地工作。只要将函数作为参数传递,就可以返回一个包含从成功消息到responseText和状态的任何内容的对象。
webServices.js
exports.protocol = function(callback) {
var url = 'www.cocoloco.com/whatever';
var webService = Ti.Network.createHTTPClient({
onload: function(e){
// on success call callback
callback({ success: true });
},
onerror: function(e){
// on error call callback
callback({ success: false });
},
timeout: 5000
});
webService.open('POST', url);
webService.send();
}
验证.js
function btnClick(){
var webServices = require('webServices');
webServices.protocol(function(e) {
if(e.success){
// open new view
MainView.open();
// close actual view
$.tabValidacion.close();
$.tabValidacion = null;
} else {
alert('error');
}
});
}