- 原文地址:'return await promise' vs 'return promise' in JavaScript
- 原文作者:Dmitri Pavlutin
- 译文出自:翻译计划
当从异步功能中返回时,您可以等待该承诺得到解决,或者您可以直接返回它:return await promise
return promise
:
js 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 个数字,并返回以承诺包裹的分区结果:
javascript 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
:
javascript 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)
javascript 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
javascript 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
javascript 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 {...}