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.addpromise[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 promisepromise.promise(deferred);return deferred;},when: function(obj) {return obj.promise();}});
