在原型中定义处理程序功能 [英] Defining Handler Functions in a Prototye

查看:108
本文介绍了在原型中定义处理程序功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个JavaScript原型,该原型将允许我以类似于jQuery ajax调用方式的方式处理流程的结果.例如:

I am trying to create a JavaScript prototype that will allow me to handle the outcome of a process in a similar way to the jQuery ajax call works. For example:

var request = $.ajax({
    //params here
})
.done(function(data, textStatus, jqXHR) {
    //action here
})
.fail(function (jqXHR, textStatus, errorThrown) {
    //action here
});

我如何声明我的原型具有donefail事件(如果甚至可以使用正确的术语),并确保它们在原型逻辑内的条件下被触发?

How do I declare my prototype to have the done and fail events (if that is even the correct term to use) and make sure that they are fired under a condition from within the prototype logic?

我想要的呼叫将是这样的:

My desired call would be something like this:

var o = myObj({
    parma1: 'a',
    param2: 'b'
})
.done(function() {
    //action here
});
.fail(function() {
    //action here
});

我希望这是有道理的,因为我不知道此过程的正确术语是什么:(

I hope this makes sense as I do not know what the correct terminologies are for this process :(

我正在使用jQuery,因此,如果有使用jQuery的更好的解决方案,那很好.

I am using jQuery so if there is a better solution using jQuery then that is fine.

推荐答案

我想您想将其用于异步任务.这是一个有点类似的解决方案:

I suppose you want to use this for an asyncrhonous task. Here is a somewhat similar solution:

var o = {
    parma1: 'a',
    param2: 'b',
    doAsyncStuff: function(complete, error){

        var someData = 0;        

        setTimeout(function(){
            someData = 1;
            complete(someData);
        }, 500);

        //or if something went wrong:
        //error(someErrorData);
    }
}

o.doAsyncStuff(function(data){
    console.log('complete', data);
}, function(data){
    console.log('error', data);
});

http://jsfiddle.net/pA99q/1/

根据要求,使用延迟对象的更新版本.如果可能需要的话,我也允许自己自由添加progress:

As requested, an updated version using deferred objects. I took myself the freedom to include progress as well, in case you might need it:

var task = (function($){

    var dfd = $.Deferred(),
        cls = function(){

            console.log('param passed:', arguments);

            for(var i = 0; i < 5; i++){

                var count = 0;

                setTimeout(function(){   

                    count++;

                    dfd.notify({ msg: 'interation ' + count + ' complete' });

                    if(count === 5)
                        dfd.resolve({ something: 1 });

                    //if anything goes wrong, 
                    //you can always reject the deferred:
                    //dfd.reject(args); 

                }, 1000 * i);

            }
        };

    cls.prototype = {
        done: dfd.promise().done,
        fail: dfd.promise().fail,
        always: dfd.promise().always,
        progress: dfd.promise().progress
    };

    return cls;

})(jQuery);

var t = new task({ foo: 'bar' }, 123, 'baz');

t.progress(function(data){
    console.log('progress:', data);
}).done(function(){
    console.log('done');
}).fail(function(){
    console.log('fail');
}).always(function(){
    console.log('always');
});

http://jsfiddle.net/hGFbt/

这篇关于在原型中定义处理程序功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆