在Prototye中定义处理程序函数

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

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

如何声明我的原型有donefail事件(如果这甚至是正确使用的术语)并确保它们是在原型逻辑中的条件下触发的?

我希望的电话会是这样的:

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

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

我正在使用jQuery,所以如果有更好的解决方案使用jQuery那么这很好。

我想你想用它来做一个exception的任务。 这是一个有点类似的解决方案:

 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 ,万一你可能需要它:

 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/