比如說現(xiàn)在有這樣一個(gè)模型
有A,B,C,D四個(gè)模塊,分別執(zhí)行proccessing()這個(gè)函數(shù),每個(gè)模塊執(zhí)行效率不一樣,所以最終得到結(jié)果時(shí)間也不一樣。
代碼抽象出來的模型如下:
var test = {
getRadom:function(min,max){
var Range = max - min;
var Rand = Math.random();
var num = min + Math.round(Rand * Range);
return num;
},
proccessing:function(param){
var dfd = $.Deferred();
var time = this.getRadom(1,4);
window.setTimeout(function(){
var tmpObj = {};
tmpObj.param = param;
tmpObj.time = time;
dfd.resolve(tmpObj);
},time * 1000);
return dfd.promise();
},
init:function(){}
}
第一種情況:如果A,B,C,D沒有先后時(shí)間關(guān)系,我只用等到四個(gè)模塊都執(zhí)行完畢后,最終得到結(jié)果即可,那么代碼層面上可以這樣寫:
var test = {
getRadom:function(min,max){
//同上
},
proccessing:function(param){
//同上
},
fun1:function(){
var me = this;
$.when(me.proccessing("A"),me.proccessing("B"),me.proccessing("C"),me.proccessing("D")).then(function(ret1,ret2,ret3,ret4){
console.log("param:" + ret1.param + "=====================" + "time:" + ret1.time);
console.log("param:" + ret2.param + "=====================" + "time:" + ret2.time);
console.log("param:" + ret3.param + "=====================" + "time:" + ret3.time);
console.log("param:" + ret4.param + "=====================" + "time:" + ret4.time);
});
}
init:function(){
this.fun1();
}
}
這段代碼運(yùn)行起來是完全沒有問題的
(一)第一種情況:
這里只有四個(gè)模塊,如果這里有10個(gè)模塊,fun1這樣寫豈不是太冗余?
所以我就嘗試用數(shù)組eval一下,代碼如下:
var test = {
getRadom:function(min,max){
//同上
},
proccessing:function(param){
//同上
},
fun2:function(){
var arr = ["A","B","C","D"],str = "",me = this;
for(var i in arr){
str += "me.proccessing(\""+ arr[i] +"\"),"
}
str = str.substring(0,str.length-1);
$.when(eval(str)).then(function(ret1,ret2,ret3,ret4){
console.log("param:" + ret1.param + "=====================" + "time:" + ret1.time);
console.log("param:" + ret2.param + "=====================" + "time:" + ret2.time);
console.log("param:" + ret3.param + "=====================" + "time:" + ret3.time);
console.log("param:" + ret4.param + "=====================" + "time:" + ret4.time);
});
},
init:function(){
this.fun2();
}
}
這里就出現(xiàn)了第一個(gè)問題eval
了一下后,只有ret1有返回值,其余的返回值全部是undefined,那么我想請教一下,如果有多個(gè)模塊,這里我該如何用循環(huán)來簡化代碼呢?
(二)第二種情況
如果A,B,C,D四個(gè)模塊,有嚴(yán)格的實(shí)行順序,必須為A->B->C->D
那么代碼如下:
var test = {
getRadom:function(min,max){
//同上
},
proccessing:function(param){
//同上
},
fun3:function(){
var me = this;
$.when(me.proccessing("A")).then(function(ret1){
console.log("param:" + ret1.param + "=====================" + "time:" + ret1.time);
$.when(me.proccessing("B")).then(function(ret2){
console.log("param:" + ret2.param + "=====================" + "time:" + ret2.time);
$.when(me.proccessing("C")).then(function(ret3){
console.log("param:" + ret3.param + "=====================" + "time:" + ret3.time);
$.when(me.proccessing("D")).then(function(ret4){
console.log("param:" + ret4.param + "=====================" + "time:" + ret4.time);
});
});
});
});
},
init:function(){
this.fun3();
}
}
這段代碼也沒有問題,但是這里就有第二個(gè)問題了,如果同樣有10個(gè)模塊,這樣嵌套寫法也非常的要人命啊,如何優(yōu)化這種寫法呢?
先謝過大家了~
apply
嗎?var arr = ["A","B","C","D"];
$.when.apply($, arr.map(v=>me.proccessing(v))).then(function(ret1,ret2,ret3,ret4){
......
}
var me = this;
var arr = ["A","B","C","D"];
$.when(me.proccessing(arr.shift())).then(function cb(ret){
console.log("param:" + ret.param + "=====================" + "time:" + ret.time);
if (arr.length > 0)
$.when(me.proccessing(arr.shift())).then(cb);
});
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。