我可以 "promisify" 仅使用异步功能吗?

Can I "promisify" a function by just using async?

所以我有一个函数应该立即 return 一个被拒绝或解决的 Promise,即它基本上是一个我想要 "promisify".

的同步函数

遇到这种情况我通常是这样的:

func() {
     // some code to check for an error
     if (hasError)
        return Promise.reject(new Error("Failure"));
     }
     return Promise.resolve("Success");
}

现在,随着 ES2017 中 "async" 函数的可用性,我似乎也可以这样做:

async func() {
     // some code to check for an error
     if (hasError)
        throw new Error("Failure");
     }
     return "Success";
}

所以我基本上使用 async 只是为了 "promisify" 我的函数,而不在函数体的任何地方使用 await。正如我所见,这个变体应该做的完全一样。我是对的,还是有其他我不知道的副作用?

我想我更喜欢这种模式,因为它更短一些,仅从函数定义中就可以清楚地看出它是异步的,并且任何 JavaScript 错误(如类型错误)也会导致拒绝让我的整体代码在出现意外错误时反应更优雅。

每当你声明一个异步函数一个AsyncFunction对象被创建,根据MDN将return一个承诺:

A Promise which will be resolved with the value returned by the async function, or rejected with an uncaught exception thrown from within the async function.

所以是的,使用 asyncpromisify 一个函数。

此外,让我们做一些测试;

async function fn(val) {
  console.log(val);
  if (val) {
    return "true";
  }
  throw new Error("false");
}

console.log(Object.getPrototypeOf(fn).constructor)

console.log(fn(true) instanceof Promise);
console.log(Object.getPrototypeOf(fn(true)).constructor)

console.log(fn(false) instanceof Promise);
console.log(Object.getPrototypeOf(fn(false)).constructor)

fn(true).then(val => console.log(val));

fn(false).catch(err => console.log("ERROR"));