簡體   English   中英

用於處理已完成的諾言的Javascript模式

[英]Javascript pattern for handling finished promise

我時不時遇到這個:

return somethingThatReturnsAPromise()
  .then((response) => {
    soSomethingg(); // Eg; update the UI
    return response;
   });

現在,我正在尋找一種不會返回任何東西的東西,並且如果我忘記了,則不會更改諾言鏈:

return somethingThatReturnsAPromise()
  .whatImLookingFor((response) => {
    doSomething(); // Eg; update the UI
   })
   .then((response) => {
     // and this one should still be able to access response
   });

也許這與承諾的概念背道而馳,但是對我來說,這有點不方便,因為我無法傳遞任意函數。

一種想法是組成一個函數:

const sideEffect = (callback) => {
  return (response) => {
    callback(response);
    return response;
  };
};

我可以將其用作

return somethingThatReturnsAPromise()
  .then(sideEffect(doSomething));

但我喜歡的東西,而不是then有這樣的事情?

注意:我正在使用Angular 1.x,所以我需要類似的東西。

我認為您不是真正在編寫.then().then() ,因為您可以將其折疊為一個.then ,但是您真正關心的是返回承諾並讓一些外部代碼在then添加另一個鏈。 在這種情況下,請執行以下操作:

let p = somethingThatReturnsAPromise();
p.then(() => doSomething());
return p;

這使調用者可以將附加的then附加到原始諾言,而不是鏈接到.then ,從而獲得原始諾言的價值。 這稱為分支承諾鏈。

也許這違背了諾言的想法

輕微地,promise鏈是管道, then處理程序在每個階段對事物進行轉換。 但是,想要不加更改地傳遞值是完全有效的。

一種想法是組成一個函數:

確實,我想到的第一件事是我該怎么做。

但我喜歡的東西,而不是then有這樣的事情?

沒有。 您可以將其添加到Promise.prototype以添加到自己的項目中(我不會在庫中)。 或者,您可以給自己一個Promise子類並將其添加到那里。

使用Promise子平台,您可以執行以下操作:

return MyPromise.resolve(somethingThatReturnsAPromise())
  .thenSide(soSomethingg); // Eg; update the UI

... thenSide是您的方法,該方法then將原始值不變地傳遞回,例如:

class MyPromise extends Promise {
    thenSide(callback) {
        this.then(callback);
        return this;
    }
}

要么

class MyPromise extends Promise {
    thenSide(callback) {
        this.then(callback);
        return MyPromise.resolve(this);
    }
}

...取決於您是否對thenSide感到煩惱, thenSide返回相同的諾言(因為then始終會返回新的諾言)。

據我所知(很可能是錯誤的),“通過”副作用的包裝方法是一種慣用的方式來完成您想要的事情。

或者(如果您在多個地方需要相同的response ),可以在遇到這種情況時斷開承諾鏈。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM