<script>
// 實(shí)現(xiàn)帶有并發(fā)控制的promise.all,返回的結(jié)果順序需要和傳入的promise順序一致
// myAll(promises, parallelLimit);
// myAll([promise1, promise2, promise3], 2)
const promise1 = function() {
return new Promise((resolve, reject) => {
console.log('promise1執(zhí)行了');
setTimeout(() => {
console.log('promise1');
resolve(1);
}, 3000)
});
}
const promise2 = function() {
return new Promise((resolve, reject) => {
console.log('promise2執(zhí)行了');
setTimeout(() => {
console.log('promise2');
resolve(2);
}, 5000)
});
}
const promise3 = function() {
console.log('promise3執(zhí)行了');
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('promise3');
resolve(3);
}, 1000)
});
}
// const b = a();
// b.then(res => {
// console.log(res);
// });
// 實(shí)現(xiàn)帶有并發(fā)控制的promise.all鸭叙,返回的結(jié)果順序需要和傳入的promise順序一致
// myAll(promises, parallelLimit);
// myAll([promise1, promise2, promise3], 2)
function myAll(promises = [], parallelLimit) {
let result = [],
runCount = 0,
queue = [];
return new Promise((resolve, reject) => {
const runPromise = (promiseFn, i) => {
if (runCount < parallelLimit) {
const promise = promiseFn();
runCount += 1;
promise.then(res => {
console.log(`promise${i + 1}完成了`);
result[i] = res;
runCount -= 1;
if (runCount === 0) {
resolve(result);
} else {
if (queue.length) {
const { promiseFn, i} = queue.shift();
runPromise(promiseFn, i);
}
}
});
} else {
queue.push({
promiseFn: promiseFn,
i: i,
})
}
};
for (let i = 0; i < promises.length; i++) {
const promiseFn = promises[i];
if (typeof promiseFn === 'function') {
runPromise(promiseFn, i);
}
}
});
// 通過(guò)隊(duì)列和遞歸的方法實(shí)現(xiàn)
// return new Promise((resolve, reject) => {
// for (let i = 0; i < promises.length; i++) {
// const promiseFn = promises[i];
// if (typeof promiseFn === 'function') {
// queue.push({
// promiseFn: promiseFn,
// i: i,
// })
// }
// }
// const runPromise = () => {
// if (runCount < parallelLimit) {
// if (queue.length) {
// const { promiseFn, i} = queue.shift();
// const promise = promiseFn();
// runCount += 1;
// promise.then(res => {
// console.log(`promise${i + 1}完成了`);
// result[i] = res;
// runCount -= 1;
// if (runCount === 0) {
// resolve(result);
// } else {
// runPromise();
// }
// });
// runPromise();
// }
// }
// };
// runPromise();
// });
}
const promises = [promise1, promise2, promise3];
myAll(promises, 2).then(res => {
console.log(res);
});
</script>
實(shí)現(xiàn)帶有并發(fā)控制的promise.all泡一,返回的結(jié)果順序需要和傳入的promise順序一致
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門惊窖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人厘贼,你說(shuō)我怎么就攤上這事界酒。” “怎么了嘴秸?”我有些...
- 文/不壞的土叔 我叫張陵毁欣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我岳掐,道長(zhǎng)凭疮,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任串述,我火速辦了婚禮执解,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纲酗。我一直安慰自己衰腌,他們只是感情好新蟆,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著右蕊,像睡著了一般琼稻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饶囚,一...
- 那天帕翻,我揣著相機(jī)與錄音,去河邊找鬼萝风。 笑死熊咽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的闹丐。 我是一名探鬼主播横殴,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼卿拴!你這毒婦竟也來(lái)了衫仑?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤堕花,失蹤者是張志新(化名)和其女友劉穎文狱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缘挽,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞄崇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了壕曼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苏研。...
- 正文 年R本政府宣布衅鹿,位于F島的核電站,受9級(jí)特大地震影響过咬,放射性物質(zhì)發(fā)生泄漏大渤。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一掸绞、第九天 我趴在偏房一處隱蔽的房頂上張望泵三。 院中可真熱鬧,春花似錦、人聲如沸切黔。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纬霞。三九已至,卻和暖如春驱显,著一層夾襖步出監(jiān)牢的瞬間诗芜,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓栓霜,卻偏偏與公主長(zhǎng)得像翠桦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胳蛮,可洞房花燭夜當(dāng)晚...