解读JSDeferred源码4
window.onload = function(){ var o = {}; Deferred.define(o); o.func = function(){alert(1); return this;} var print = function(a){ alert(a) } Deferred.parallel([ // 配列かハッシュのどちらかで渡す /* 使い方 1 : Deferred.next を定義したオレオレオブジェクトを渡す */ o.func() /* 使い方 2 : Deferred チェーンを渡す */ ,Deferred.next( function(){ alert(2) } ) ,Deferred.wait(1).next( function(){ alert(3) } ) ,Deferred.call(print, 4) /* 使い方 3 : 新しい Deferred インスタンスを作ってそれを渡す */ ,(function(){ var d = new Deferred(); setTimeout(function(){ alert(5); d.call(); // ← ここで call することで遅延チェーンが繋がる },2000); return d; })() ]) .next(function(){ // もちろん Deferred チェーンを繋げることができる。 alert(6); }); }
Deferred.parallel = function (dl) { if (arguments.length > 1) dl = Array.prototype.slice.call(arguments); var ret = new Deferred(), values = {}, num = 0; for (var i in dl) if (dl.hasOwnProperty(i)) (function (d, i) { if (typeof d == "function")d = next(d); d.next(function (v) { values[i] = v; if (--num <= 0) { if (dl instanceof Array) { values.length = dl.length; values = Array.prototype.slice.call(values, 0); } ret.call(values); } }).error(function (e) { ret.fail(e); }); num++; })(dl[i], i); if (!num) Deferred.next(function () {//链结下一个Deferred链 ret.call() }); ret.canceller = function () { for (var i in dl) if (dl.hasOwnProperty(i)) { dl[i].cancel(); } }; return ret; };
机器瞎学/数据掩埋/模式混淆/人工智障/深度遗忘/神经掉线/计算机幻觉/专注单身二十五年