goo*_*ion 10 javascript async-await es6-promise
我在我的代码中的几个地方使用async/ await.
例如,如果我有这个功能:
async function func(x) {
...
return y;
}
Run Code Online (Sandbox Code Playgroud)
然后我总是这样称呼它:
async function func2(x) {
let y = await func(x);
...
}
Run Code Online (Sandbox Code Playgroud)
我注意到在某些情况下,我可以省略await并且程序仍然可以正常运行,因此我无法弄清楚何时必须使用await以及何时可以放弃它.
我已经得出结论,await直接在return语句中删除它是"合法的" .
例如:
async function func2(x) {
...
return func(x); // instead of return await func(x);
}
Run Code Online (Sandbox Code Playgroud)
这个结论是否正确,否则,我在这里错过了什么?
编辑:
一个小的(但很重要的)概念,在我刚刚遇到并实现的任何答案中都没有提到过:
它不是"合法"地掉落await一个内return声明,如果被调用函数可能会抛出异常,因此这种说法是内部执行try块.
例如,删除await下面的代码是"危险的":
async function func1() {
try {
return await func2();
}
catch (error) {
return something_else;
}
}
Run Code Online (Sandbox Code Playgroud)
原因是try块完成没有异常,Promise对象返回"正常".但是,在调用外部函数的任何函数中,当Promise"执行" 该对象时,将发生实际错误并抛出异常.只有在await使用时,才会在外部函数中成功处理此异常.否则,该责任会增加,需要额外的try/ catch条款.
如果func是异步函数,则使用和不使用它都会await产生不同的效果.
async function func(x) {
return x;
}
let y = await func(1); // 1
let z = func(1) // Promise (resolves to 1)
Run Code Online (Sandbox Code Playgroud)
省略await关键字总是合法的,但意味着你必须处理传统风格的承诺(首先要击败异步/等待点).
func(1).then(z => /* use z here */)
Run Code Online (Sandbox Code Playgroud)
如果你的返回语句使用await那么你可以确定如果它抛出错误它可以被捕获到你的函数内部,而不是通过调用它的代码.
| 归档时间: |
|
| 查看次数: |
955 次 |
| 最近记录: |