Node 8 LTS 有 async 了很兴奋? 来,说说这 2 段代码的区别。
发布于 7 年前 作者 atian25 10658 次浏览 来自 分享
async function rejectionWithReturnAwait () {
  try {
    return await Promise.reject(new Error());
  } catch (e) {
    return 'Saved!';
  }
}

async function rejectionWithReturn () {
  try {
    return Promise.reject(new Error());
  } catch (e) {
    return 'Saved!';
  }
}
23 回复

感觉跟我这两个return差不多 QQ截图20171101170057.png

rejectionWithReturnAwait 可以理解为

const err  = await Promise.reject(new Error());
return err;

await一个reject的Promise在这里会抛出错误,直接被catch,因此返回resolve 'Saved!'的Promise

rejectionWithReturn 直接返回那个reject的Promise,也就是上面的err

第一个是真的用了async,会先等待,等处理完后再返回,处理的过程抛出了异常,所以能被catch 第二个是直接执行过程,把error当作返回值返回给函数调用方,这样子就不会trycatch就没用了,其实用了障眼法,改成这样子估计大家就理解了

async function rejectionWithReturnAwait() {
  try {
    const result = await Promise.reject(new Error());
    return result;
  } catch (e) {
    return "Saved!";
  }
}
async function rejectionWithReturn() {
  try {
    const result = Promise.reject(new Error());
    return result;
  } catch (e) {
    return "Saved!";
  }
}
console.log("1:" + rejectionWithReturnAwait());
console.log("2:" + rejectionWithReturn());

事实告诉我们,代码风格,易读性多么重要

@mumudev 再次回复,我不是狼叔。

@atian25 你是哥不是叔~

额 那到底是那样写比较好。。

我认为 第二个catch不到error,try catch无法捕获异步异常。

第2个等同于

Promise.resolve(Promise.reject(new Error()))

@dengnan123 第二个是有坑的,那个 catch 进不去

我觉得很容易理解的啊,await 后面跟promise对象表示执行这个这个promise拿到结果,相当于调用了这个promise的then, 第二个函数就是把promise对象返回回去而已,try catch在这里毛线用都没有,

用过c#的都知道,async是有传染性的,要用就一直用到底

@mumudev 标点对阅读也很重要~ “这样就不会try catch,(也)就没用了”

来自酷炫的 CNodeMD

你在搞事情

async 跟 nodejs8 有什么关系,在 nodejs 7.6 就开始有了

@Hyurl Node 8.9.0 是第一个支持 Async 的 LTS 版本

第二条异步没有使用await接受,他的返回结果就无法try/catch到

回到顶部