Deferred设计
和ES6的Promise很像,设计灵感来自Deferred对象。
代码实现如下:
var wait = function() {
var deferred = $.Deferred();
console.log(deferred);
var test = function() {
console.log('开车了!');
deferred.resolve('Max');
}
setTimeout(test, 2000);
return deferred;
}
$.when(wait())
.done(function() {
console.log('done');
})
.fail(function() {
console.log('fail');
});
jQuery.extend({
// 异步回调解决方案
Deferred: function(func) {
var tuples = [
["resolve", "done", jQuery.callbacks("once memory"), "resolved"],
["reject", "fail", jQuery.callbacks("once memory"), "rejected"],
["notify", "progress", jQuery.callbacks("memory")],
];
var deferred = {};
var state = 'pending';
var promise = {
state: function() {
return state;
},
then: function() { // done, fail, progress
},
promise: function(obj) {
return obj != null ? jQuery.extend(obj, promise) : promise;
}
};
tuples.forEach(function(tuple, i){
var list = tuple[2];
var stateString = tuple[3];
// promise[done, fail, progress] = list.add
promise[tuple[1]] = list.add;
if(stateString) {
list.add(function() {
state = stateString;
});
}
deferred[tuple[0]+'With'] = list.fire;
// deferred [resolve, reject, notify]
deferred[tuple[0]] = function() {
deferred[tuple[0] + 'With'](this === deferred ? promise : this, arguments);
return this;
};
});
// make deferred as a promise
promise.promise(deferred);
return deferred;
},
when: function(obj) {
return obj.promise();
}
});