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

时间:2014-01-09 20:29:46

标签: javascript asynchronous event-handling titanium promise

我的代码工作正常,但我根本不喜欢。

我想将一个文件拆分为两个文件,一个包含webServices,另一个包含控制器。

我的文件是这样的:

文件:Validacion.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 -library-和validation.js -controller - )。

问题是我总是有消息“错误”,因为我传递了“success = webServices.protocol();”但只要它是“异步”,它就不会停止并转到下面的代码行而没有服务器答案。

文件:webServices.js(library)

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();      

}

文件:Validacion.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');
    }
}

我考虑过两种可能的选择:

  • 使用承诺。

  • 在“成功”上触发一个新事件并使用该事件运行另一个回调函数(在此函数中,我打开新视图并关闭前一个视图)。

我不知道这个事件是一个文件(库)和另一个(控制器)中的回调函数有多困难

我从未使用过任何这些解决方案,因此我不知道它们有多“好”。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

回调方法在大多数情况下都能正常工作。只需将函数作为参数传递,就可以将包含成功消息中任何内容的对象返回到responseText和status。

<强> 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();      
}

<强> Validacion.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');
        }
    });
}