异步处理(库中的回调+控制器)



我的代码运行良好,但我一点也不喜欢。

我想将一个文件拆分为两个文件,一个包含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');
}
});
}

相关内容

  • 没有找到相关文章

最新更新