我可以"宣传"只使用异步的函数?

时间:2018-06-02 18:48:27

标签: javascript asynchronous promise ecmascript-2017

所以我有一个函数应该立即返回一个被拒绝或已经解决的Promise,即它基本上是一个我想要的snychronous函数" promisify"。

在这种情况下我通常做的是这样的事情:

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

现在,有了" async" ES2017中的功能似乎我也可以这样做:

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

所以我基本上只使用async来宣传"我的函数,在函数体中没有使用await。正如我所看到的,这种变体应该完全相同。我是对的,还是有任何其他副作用我不知道在这里?

我认为我更喜欢这种模式,因为它有点短,从单独的函数定义可以非常清楚它是异步的,并且任何JavaScript错误(如类型错误)也会导致拒绝,这使我的如果出现意外错误,整体代码会更优雅地做出反应。

1 个答案:

答案 0 :(得分:4)

每当您声明一个异步函数时,就会创建一个AsyncFunction对象,根据MDN将返回一个Promise:

  

一个Promise,它将使用async函数返回的值进行解析,或者在异步函数中抛出未捕获的异常而被拒绝。

所以是的,使用async宣传一个函数。

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

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"));