亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在javascript-內存考慮事項中遞歸構建承諾鏈

在javascript-內存考慮事項中遞歸構建承諾鏈

慕娘9325324 2019-12-18 18:12:01
在javascript-內存考慮事項中遞歸構建承諾鏈在……里面這個答案,承諾鏈是遞歸構建的。略為簡化,我們有: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}這可能會導致調用堆棧。和一條承諾鏈-“深”和“寬”。我預計內存峰值會比執行遞歸或單獨構建承諾鏈更大。是這樣嗎?有沒有人考慮過以這種方式構建鏈的記憶問題?記憶消耗在承諾庫之間會有所不同嗎?
查看完整描述

3 回答

?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

過早的優化是不好的,找出性能差異的真正方法是測試您的代碼,你不應該擔心這個問題(我只需要做一次,我已經為至少100個項目做出了承諾)。

是這樣嗎?

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

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

有沒有人考慮過以這種方式構建鏈的記憶問題?

當然,這是一個很大的問題,也是使用類似于Promise.each在像藍知更鳥這樣的圖書館里then能干的鏈子。

為了避免這種風格,我個人在代碼中使用了一個快速應用程序,該應用程序只遍歷VM中的所有文件-但在絕大多數情況下,這是一個沒有問題的問題。

記憶消耗在承諾庫之間會有所不同嗎?

是的,非常重要。例如,藍鳥3.0將不會分配額外的隊列,如果它檢測到承諾操作已經是異步的(例如,如果它以Promise.Delay開頭),并且只會同步執行(因為異步保證已經被保留)。

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

再說一遍-這并不令人驚訝,因為承諾庫之間的差別是數量級的。



查看完整回答
反對 回復 2019-12-20
?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

我剛出了一個可能有助于解決問題的黑客:不要在最后一次做遞歸then,更確切地說,在最后一次做這件事catch,因為catch不在解決鏈之外。使用您的例子,應該是這樣的:

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}



查看完整回答
反對 回復 2019-12-20
  • 3 回答
  • 0 關注
  • 332 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號