当前栏目
JavaScript中的 "return await promise" 与 "return promise"
- 原文地址:'return await promise' vs 'return promise' in JavaScript
- 原文作者:Dmitri Pavlutin
- 译文出自:掘金翻译计划
当从异步功能中返回时,您可以等待该承诺得到解决,或者您可以直接返回它:return await promise
return promise
:
async function func1() {
const promise = asyncOperation();
return await promise;
}
// vs
async function func2() {
const promise = asyncOperation();
return promise;
}
复制代码
您很快就会看到这两种表达方式都有效。
但是,当这些表达方式不同时,是否有情况?让我们来看看!
1. 相同行为
为了找到两个表达式(与)的区别,(return await promise
vs return promise
), 我要使用辅助功能。 delayedDivide(n1, n2)
.
该函数除以 2 个数字,并返回以承诺包裹的分区结果:
function promisedDivision(n1, n2) {
if (n2 === 0) {
return Promise.reject(new Error("Cannot divide by 0"));
} else {
return Promise.resolve(n1 / n2);
}
}
复制代码
如果第二个(二维索)论点是,该函数返回拒绝的承诺,因为无法按分除。00
好的,定义帮手功能,让我们划分一些数字。
下列功能使用表达方式,通过包裹在承诺中返回划分: divideWithAwait()
uses return await promisedDivision(6, 2)
6
by 2
:
async function divideWithAwait() {
return await promisedDivision(6, 2);
}
async function run() {
const result = await divideWithAwait();
console.log(result); // logs 3
}
run();
复制代码
在函数内,表达式会对部门结果进行评估。都很好run()``await divideWithAwait()``3
现在,让我们尝试使用没有关键字的第二个表达式,并直接返回包装部门结果的承诺:await``return promisedDivision(6, 2)
async function divideWithoutAwait() {
return promisedDivision(6, 2);
}
async function run() {
const result = await divideWithoutAwait();
console.log(result); // logs 3
}
run();
复制代码
即使不使用内部的关键字,功能内的表达仍然正确地评估为! await
keyword inside divideWithoutAwait()
, await divideWithoutAwait()
run()
6 / 2
3
!
在此步骤中,您已经看到使用和没有区别 return await promise
and return promise
至少在处理成功履行承诺时。
但是,让我们搜索更多!
2. 不同行为
现在,让我们采取另一种方法,特别是尝试与被拒绝的承诺合作。要使功能返回被拒绝的承诺,让我们设置第二个参数。promisedDivision(n1, n2)0
因为现在会返回被拒绝的承诺,让我们也包装到一个 - 看看被拒绝的承诺是否被抓住。promisedDivision(n1, 0)try {... } catch (error) {...}
好的,让我们使用关键字的表达方式:return await promisedDivision(5, 0)await
async function divideWithAwait() {
try {
return await promisedDivision(5, 0);
} catch (error) {
// Rejection caught
console.log(error); // logs Error('Cannot divide by 0')
}
}
async function run() {
const result = await divideWithAwait();
}
run();
复制代码
因为零分是不可能的,因此返回被拒绝的承诺。成功抓住了被拒绝的承诺抛出。promisedDivision(5, 0)catch(error) { ... }promisedDivision(5, 0)
第二种方法呢?其中省略了哪些方法?await
async function divideWithoutAwait() {
try {
return promisedDivision(5, 0);
} catch (error) {
// Rejection NOT caught
console.log(error);
}
}
async function run() {
const result = await divideWithoutAwait();
}
run(); // Uncaught Error: Cannot divide by 0
复制代码
然而,这一次没有兑现被拒绝的承诺。catch(error) { ... }
现在,您可以轻松地看到使用和:return await promisereturn promise
当被包裹起来时,附近的渔获物只有在等待承诺时才会被拒绝(这是事实)。try { ... }catch(error) { ... }promisereturn await promise`).
3. 结论
在大多数情况下,特别是如果承诺成功解决,使用和使用之间没有太大的区别。return await promisereturn promise
但是,如果你想抓住拒绝的承诺,你从异步功能返回,那么你绝对应该使用表达和故意添加。return await promiseawait
`catch(error) {...}声明捕获只等待拒绝的承诺在声明中。try {...}
喜欢这个帖子?请分享!
相关文章
- 前端面试 【JavaScript】— typeof 是否能正确判断类型?
- 前端面试 【JavaScript】— instanceof 能否判断基本数据类型?
- 前端面试 【JavaScript】— 能不能手动实现一下 instanceof 的功能?
- 前端面试 【JavaScript】— Object.is和=== 有什么区别?
- 前端面试 【JavaScript】— JS中类型转换有哪几种?
- 前端面试 【JavaScript】— == 和 ===有什么区别?
- 前端面试 【JavaScript】— 对象转原始类型是根据什么流程运行的?
- JavaScript 的 parseInt() 函数
- javascript实现两个数字进行组合
- JS监听键盘按键
- 大前端开发中的路由管理之五:Flutter篇
- Javascript的DOM操作
- 在Vue项目中使用WebSocket技术
- 新手向:前端程序员必学基本技能——调试JS代码
- React 毁了 Web 开发!
- 「JS 逆向百例」cnki 学术翻译 AES 加密分析
- 商标注册域名后缀用什么?商标和域名有哪些区别?
- 网站建设流程是怎样的?需要看重哪些细节?
- 网站域名商标注册流程是什么?网站域名商标有什么用?
- 如何建设一个实用性强的网站 网站上线后如何运营