第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在javascript-內(nèi)存考慮事項(xiàng)中遞歸構(gòu)建承諾鏈

在javascript-內(nèi)存考慮事項(xiàng)中遞歸構(gòu)建承諾鏈

阿晨1998 2019-07-17 15:53:17
在javascript-內(nèi)存考慮事項(xiàng)中遞歸構(gòu)建承諾鏈在……里面這個(gè)答案,承諾鏈?zhǔn)沁f歸構(gòu)建的。略為簡(jiǎn)化,我們有:function foo() {     function doo() {         // always return a promise         if (/* more to do */) {             return doSomethingAsync().then(doo);         } else {             return Promise.resolve();         }     }     return doo(); // returns a promise}這可能會(huì)導(dǎo)致調(diào)用堆棧。和一條承諾鏈-“深”和“寬”。我預(yù)計(jì)內(nèi)存峰值會(huì)比執(zhí)行遞歸或單獨(dú)構(gòu)建承諾鏈更大。是這樣嗎?有沒(méi)有人考慮過(guò)以這種方式構(gòu)建鏈的記憶問(wèn)題?記憶消耗在承諾庫(kù)之間會(huì)有所不同嗎?
查看完整描述

3 回答

?
PIPIONE

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊

過(guò)早的優(yōu)化是不好的,找出性能差異的真正方法是測(cè)試您的代碼,你不應(yīng)該擔(dān)心這個(gè)問(wèn)題(我只需要做一次,我已經(jīng)為至少100個(gè)項(xiàng)目做出了承諾)。

是這樣嗎?

這些承諾必須“記住”它們遵循的內(nèi)容,如果您對(duì)10000的承諾執(zhí)行此操作,您將有一個(gè)10000長(zhǎng)的承諾鏈,如果您不這樣做,您就不會(huì)(例如,使用遞歸)-對(duì)于任何排隊(duì)流控制,這都是正確的。

如果你必須跟蹤10000件額外的東西(操作),那么你需要為它保留內(nèi)存,這需要時(shí)間,如果這個(gè)數(shù)字是一百萬(wàn),它可能是不可行的。各圖書館的情況各不相同。

有沒(méi)有人考慮過(guò)以這種方式構(gòu)建鏈的記憶問(wèn)題?

當(dāng)然,這是一個(gè)很大的問(wèn)題,也是使用類似于Promise.each在像藍(lán)知更鳥這樣的圖書館里then能干的鏈子。

為了避免這種風(fēng)格,我個(gè)人在代碼中使用了一個(gè)快速應(yīng)用程序,該應(yīng)用程序只遍歷VM中的所有文件-但在絕大多數(shù)情況下,這是一個(gè)沒(méi)有問(wèn)題的問(wèn)題。

記憶消耗在承諾庫(kù)之間會(huì)有所不同嗎?

是的,非常重要。例如,藍(lán)鳥3.0將不會(huì)分配額外的隊(duì)列,如果它檢測(cè)到承諾操作已經(jīng)是異步的(例如,如果它以Promise.Delay開頭),并且只會(huì)同步執(zhí)行(因?yàn)楫惒奖WC已經(jīng)被保留)。

這意味著,我在對(duì)第一個(gè)問(wèn)題的回答中所聲稱的并不總是正確的(但在常規(guī)用例中是正確的):除非提供內(nèi)部支持,否則本機(jī)承諾永遠(yuǎn)無(wú)法做到這一點(diǎn)。

再說(shuō)一遍-這并不令人驚訝,因?yàn)槌兄Z庫(kù)之間的差別是數(shù)量級(jí)的。


查看完整回答
反對(duì) 回復(fù) 2019-07-17
?
素胚勾勒不出你

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊

我剛出了一個(gè)可能有助于解決問(wèn)題的黑客:不要在最后一次做遞歸then,更確切地說(shuō),在最后一次做這件事catch,因?yàn)?/trans>catch不在解決鏈之外。使用您的例子,應(yīng)該是這樣的:

function foo() {
    function doo() {
        // always return a promise
        if (/* more to do */) {
            return doSomethingAsync().then(function(){
                        throw "next";
                    }).catch(function(err) {
                        if (err == "next") doo();
                    })
        } else {
            return Promise.resolve();
        }
    }
    return doo(); // returns a promise}


查看完整回答
反對(duì) 回復(fù) 2019-07-17
  • 3 回答
  • 0 關(guān)注
  • 254 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)