解读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;
};
机器瞎学/数据掩埋/模式混淆/人工智障/深度遗忘/神经掉线/计算机幻觉/专注单身二十五年
浙公网安备 33010602011771号