簡體   English   中英

如何從異步函數返回擴展的承諾實例?

[英]How to return an extended promise instance from an async function?

我只是在玩弄我的框架的一些想法,假設我像這樣擴展了 promise 類

class cool_promise extends Promise {
    cool_function() {
        console.log("I am cool");
    }
}

並有一個異步功能,如

async cool_function() {
    return "functioning";
}

現在默認情況下,cool_function 在同步執行時只返回一個常規的 Promise,但是否可以讓特定於我的框架的異步函數返回我的擴展 Promise 類?

async關鍵字將始終導致函數返回本機 Promise。 要返回自定義承諾,您的函數需要在沒有async情況下聲明並直接返回承諾。

您可以像平常一樣編寫異步函數,但在將它們作為框架接口的一部分公開之前,將它們用返回 CoolPromise 的函數包裝起來:

 class CoolPromise extends Promise { coolFunction ( ) { return 'I am cool'; } static decorate ( func ) { return function (...args) { return CoolPromise.resolve( func.call( this, ...args ) ); }; } } // Some module with an async function in it const module = function Module ( ) { async function foo( ) { return 'bar'; } // Decorate functions before exposing them from your modules return { foo: CoolPromise.decorate( foo ) }; }( ); // Verify that module.foo( ) returns a CoolPromise (async ( ) => { console.log( await module.foo( ) ); console.log( module.foo( ).coolFunction( ) ); })();

不,您必須使用cool_promise.resolve(cool_function())手動轉換它。 如果不使用 JavaScript 預處理器,異步函數將始終返回本機Promise

有時另一種選擇是擴展原生Promise原型:

Object.defineProperty(Promise.prototype, 'cool_function', {
    configurable: true,
    writable: true,
    value() {
        console.log("I am cool");
    },
});

但是,修改全局變量總是有與其他庫/用戶代碼或以后對語言的更改發生沖突的風險。 有時最好有一個獨立的功能。 也許有一天可以在類似於方法調用語法的管道中使用這種函數 - 例如,有一個建議可以讓你這樣做或類似的事情:

const cool_extension = (promise) => {
    console.log("I am cool");
};

cool_function() |> cool_extension
// cool_function().cool_extension(), when extending prototype

同時, cool_extension(cool_function())還不錯,而且很熟悉。

暫無
暫無

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

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