[英]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.