在 Array.some 中正確使用 async

封面

使用 Promise 檢查集合

本文譯自:How to use async functions with Array.some and every in Javascript -

第一篇文章中, 我們介紹了async / await 如何幫助執(zhí)行異步命令 ,但是在異步處理集合時卻無濟于事钮孵。在這篇文章中汗菜,當結(jié)果為布爾值時玄窝,我們將研究 someevery 函數(shù)用于更有效的 reduce

1. some 和 every 函數(shù)

這些函數(shù)與filter一樣蚪腋,獲得遞歸函數(shù),但是它們根據(jù)斷言函數(shù)是否返回特定值而返回單個 true / false。對于some婚温,如果任何斷言函數(shù)返回 true,則結(jié)果為true媳否。對于該every函數(shù)栅螟,如果返回任何false,則結(jié)果將為false篱竭。

const arr = [1, 2, 3];

const someRes = arr.some((i) => {
    return i % 2 === 0;
});

console.log(someRes);
// true

const everyRes = arr.every((i) => {
    return i < 2;
});

console.log(everyRes);
// false

2. 異步 some/every

2.1 使用異步 filter

僅考慮結(jié)果力图,可以使用 async 來模擬這些函數(shù)filter,在上一篇文章中已經(jīng)介紹了如何將其轉(zhuǎn)換為async掺逼。

// sync
const some = (arr, predicate) => arr.filter(predicate).length > 0;
const every = (arr, predicate) => arr.filter(predicate).length === arr.length;

// async
const asyncSome =
    async (arr, predicate) => (await asyncFilter(arr, predicate)).length > 0;
const asyncEvery =
    async (arr, predicate) => (await asyncFilter(arr, predicate)).length === arr.length;

短路(Short-circuiting)

但是吃媒,內(nèi)置的some/ every函數(shù)和filter的實現(xiàn)之間存在重要的區(qū)別。當有一個元素為時返回true時吕喘,some將短路并且不處理其余元素:

const arr = [1, 2, 3];

const res = arr.some((i) => {
    console.log(`Checking ${i}`);
    return i % 2 === 0;
});

// Checking 1
// Checking 2

console.log(res);
// true

同樣赘那,every在第一個錯誤結(jié)果之后停止:

const arr = [1, 2, 3];

const res = arr.every((i) => {
    console.log(`Checking ${i}`);
    return i < 2;
});

// Checking 1
// Checking 2

console.log(res);
// false

讓我們看看如何編寫一個異步版本,該版本以類似的方式工作并且工作量最少氯质!

2.2 異步 some

最好的解決方案是使用異步進行迭代募舟,并在找到結(jié)果為 true 后立即返回:

const arr = [1, 2, 3];

const asyncSome = async (arr, predicate) => {
    for (let e of arr) {
        if (await predicate(e)) return true;
    }
    return false;
};
const res = await asyncSome(arr, async (i) => {
    console.log(`Checking ${i}`);
    await sleep(10);
    return i % 2 === 0;
});

// Checking 1
// Checking 2

console.log(res);
// true

對于第一個元素predicate(e)返回結(jié)果為 true,它結(jié)束了for循環(huán)闻察。

2.3 異步 every

類似的結(jié)構(gòu)適用于every拱礁,這只是對條件求反的問題:

const arr = [1, 2, 3];

const asyncEvery = async (arr, predicate) => {
    for (let e of arr) {
        if (!await predicate(e)) return false;
    }
    return true;
};
const res = await asyncEvery(arr, async (i) => {
    console.log(`Checking ${i}`);
    await sleep(10);
    return i < 2;
});

// Checking 1
// Checking 2

console.log(res);
// false

只要predicate(e)返回false,函數(shù)便會終止而不檢查其他元素蜓陌。

2.4 并行處理

短路( short-circuiting )實現(xiàn)順序地處理元素觅彰,這在資源使用方面很有效吩蔑,但可能導致執(zhí)行時間更長钮热。

例如,如果通過遞歸發(fā)送網(wǎng)絡請求烛芬,則一次發(fā)送一個請求可能會花費一些時間隧期。另一方面飒责,雖然這可能導致發(fā)送更多的請求,但同時發(fā)送所有請求會更快仆潮。

3. 結(jié)論

someevery功能很接近異步filter宏蛉,但要嚴格遵循同步規(guī)范,異步for循環(huán)是一個更好的選擇性置。

推薦閱讀

如果對你有所幫助拾并,可以點贊、收藏鹏浅。

您的關注是莫大的鼓勵 ?(^_-)
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗅义,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子隐砸,更是在濱河造成了極大的恐慌之碗,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件季希,死亡現(xiàn)場離奇詭異褪那,居然都是意外死亡,警方通過查閱死者的電腦和手機式塌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門博敬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人峰尝,你說我怎么就攤上這事冶忱。” “怎么了境析?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵囚枪,是天一觀的道長。 經(jīng)常有香客問我劳淆,道長链沼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任沛鸵,我火速辦了婚禮括勺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘曲掰。我一直安慰自己疾捍,他們只是感情好,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布栏妖。 她就那樣靜靜地躺著乱豆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吊趾。 梳的紋絲不亂的頭發(fā)上宛裕,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天瑟啃,我揣著相機與錄音,去河邊找鬼揩尸。 笑死蛹屿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的岩榆。 我是一名探鬼主播错负,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼勇边!你這毒婦竟也來了湿颅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤粥诫,失蹤者是張志新(化名)和其女友劉穎油航,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怀浆,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡谊囚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了执赡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镰踏。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沙合,靈堂內(nèi)的尸體忽然破棺而出奠伪,到底是詐尸還是另有隱情,我是刑警寧澤首懈,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布绊率,位于F島的核電站,受9級特大地震影響究履,放射性物質(zhì)發(fā)生泄漏滤否。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一最仑、第九天 我趴在偏房一處隱蔽的房頂上張望藐俺。 院中可真熱鬧,春花似錦泥彤、人聲如沸欲芹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菱父。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滞伟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工炕贵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留梆奈,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓称开,卻偏偏與公主長得像亩钟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鳖轰,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容