zl程序教程

您现在的位置是:首页 >  Javascript

当前栏目

JavaScript中的 "return await promise" 与 "return promise"

2023-04-18 14:45:23 时间

当从异步功能中返回时,您可以等待该承诺得到解决,或者您可以直接返回它: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();
复制代码

Try the demo.

在函数内,表达式会对部门结果进行评估。都很好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();
复制代码

Try the demo.

即使不使用内部的关键字,功能内的表达仍然正确地评估为! 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();
复制代码

Try the demo.

因为零分是不可能的,因此返回被拒绝的承诺。成功抓住了被拒绝的承诺抛出。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
复制代码

Try the demo.

然而,这一次没有兑现被拒绝的承诺。catch(error) { ... }

现在,您可以轻松地看到使用和:return await promisereturn promise

当被包裹起来时,附近的渔获物只有在等待承诺时才会被拒绝(这是事实)。try { ... }catch(error) { ... }promisereturn await promise`).

3. 结论

在大多数情况下,特别是如果承诺成功解决,使用和使用之间没有太大的区别。return await promisereturn promise

但是,如果你想抓住拒绝的承诺,你从异步功能返回,那么你绝对应该使用表达和故意添加。return await promiseawait

`catch(error) {...}声明捕获只等待拒绝的承诺在声明中。try {...}

喜欢这个帖子?请分享!