CNode

Node 8 LTS 有 async 了很兴奋? 来,说说这 2 段代码的区别。

分享
Aatian25发布于9 年前最后回复8 年前23 回复11875 浏览0 收藏
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)

F
fantasticsoul#1·9 年前

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

S
shuaishenk#2·9 年前

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

D
dislido#3·9 年前

rejectionWithReturnAwait 可以理解为

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

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

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

I
ianchn#4·9 年前
M
mumudev#5·9 年前

第一个是真的用了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());

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

D
dengnan123#8·9 年前

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

Q
qinyang1980#9·9 年前

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

Y
yviscool#10·9 年前

第2个等同于

Promise.resolve(Promise.reject(new Error()))
A
atian25#12·9 年前
引用 dengnan123额 那到底是那样写比较好。。

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

A
alsotang#14·9 年前
A
atian25#15·9 年前
引用 alsotang@atian25 猪叔!

@alsotang @_@

J
JsonSong89#16·9 年前

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

P
popomore#18·9 年前

你在搞事情

H
Hyurl#20·9 年前

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

A
atian25#21·9 年前
引用 Hyurlasync 跟 nodejs8 有什么关系,在 nodejs 7.6 就开始有了

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

Y
yujintang#22·9 年前

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

X
x22x22#23·8 年前

mark

参与回复
登录后即可参与回复。登录