首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我可以仅仅使用异步来“简化”一个函数吗?

我可以仅仅使用异步来“简化”一个函数吗?
EN

Stack Overflow用户
提问于 2018-06-03 02:48:27
回答 1查看 407关注 0票数 2

所以我有一个函数,它应该立即返回一个被拒绝或解决的Promise,也就是说,它基本上是一个我想“中止”的同步函数。

在这种情况下,我通常会这样做:

代码语言:javascript
复制
func() {
     // some code to check for an error
     if (hasError)
        return Promise.reject(new Error("Failure"));
     }
     return Promise.resolve("Success");
}

现在,有了ES2017中的“异步”功能,我似乎也可以做到这一点:

代码语言:javascript
复制
async func() {
     // some code to check for an error
     if (hasError)
        throw new Error("Failure");
     }
     return "Success";
}

因此,我基本上只是为了“简化”我的函数而使用async,而不是在函数体中使用await。在我看来,这个变体应该做完全相同的事情。我说的对吗?还有其他我不知道的副作用吗?

我想我更喜欢这个模式,因为它有点短,单从函数定义就很清楚它是异步的,任何JavaScript错误(如类型错误)也会导致拒绝,这会使我的整个代码在出现意外错误的情况下做出更优雅的反应。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-03 03:03:53

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

将使用异步函数返回的值进行解析的承诺,或使用异步函数中抛出的未捕获异常而拒绝的承诺。

所以,是的,它使用async会简化一个函数。

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

代码语言:javascript
复制
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"));

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50660103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档