我正在尝试创建一个JavaScript原型,它允许我以类似于jQuery ajax调用的方式处理进程的结果。例如:
var request = $.ajax({
//params here
})
.done(function(data, textStatus, jqXHR) {
//action here
})
.fail(function (jqXHR, textStatus, errorThrown) {
//action here
});
如何声明我的原型具有done
和fail
事件(如果这甚至是正确使用的术语)并确保它们在原型逻辑中的条件下被触发?
我希望的电话会是这样的:
var o = myObj({
parma1: 'a',
param2: 'b'
})
.done(function() {
//action here
});
.fail(function() {
//action here
});
我希望这是有道理的,因为我不知道这个过程的正确术语是什么:(
我正在使用jQuery,所以如果使用jQuery有更好的解决方案那么这很好。
答案 0 :(得分:1)
我想你想把它用于异步任务。这是一个类似的解决方案:
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);
});
根据要求,使用延迟对象的更新版本。我自己也可以自由地加入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');
});