首页 > 解决方案 > 如何从异步函数返回扩展的 Promise 实例?

问题描述

我只是在玩弄我的框架的一些想法,假设我像这样扩展了 Promise 类

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

并有一个异步功能,如

async cool_function() {
    return "functioning";
}

现在默认情况下,cool_function 在同步执行时只返回一个常规 Promise,但是是否可以让特定于我的框架的异步函数返回我扩展的 Promise 类?

标签: javascriptasynchronous

解决方案


async关键字将始终导致函数返回本机 Promise。要返回一个自定义的 Promise,你的函数需要在没有声明async的情况下直接返回 Promise。

您可以像平常一样编写异步函数,但在将它们作为框架接口的一部分公开之前,用返回 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( ) );
})();


推荐阅读