的return
目的是拒绝后终止函数的执行,防止代码执行后它。
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
reject("Cannot divide by 0");
return; // The function execution ends here
}
resolve(numerator / denominator);
});
}
在这种情况下,它会阻止resolve(numerator / denominator);
执行,这不是严格需要的。但是,最好还是终止执行以防止将来出现可能的陷阱。此外,防止不必要地运行代码也是一种很好的做法。
背景
Promise可以处于以下三种状态之一:
- 待定 - 初始状态。从待定我们可以移动到其他状态之一
- 完成 - 成功操作
- 拒绝 - 失败的操作
当一个Promise被履行或被拒绝时,它将无限期地保持在这个状态(已解决)。因此,拒绝已履行的Promise或履行已拒绝的Promise,都不会产生影响。
此示例代码段表明,虽然Promise在被拒绝后得到了履行,但它仍然被拒绝。
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
reject("Cannot divide by 0");
}
resolve(numerator / denominator);
});
}
divide(5,0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
那么我们为什么需要返回呢?
虽然我们不能改变一个已解决的Promise状态,但拒绝或解决不会停止函数其余部分的执行。该函数可能包含会产生混淆结果的代码。例如:
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
reject("Cannot divide by 0");
}
console.log('operation succeeded');
resolve(numerator / denominator);
});
}
divide(5, 0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
即使函数现在不包含这样的代码,这也会造成未来可能的陷阱。未来的重构可能会忽略在 promise 被拒绝后代码仍在执行的事实,并且将难以调试。
解决/拒绝后停止执行:
这是标准的 JS 控制流的东西。
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
reject("Cannot divide by 0");
return;
}
console.log('operation succeeded');
resolve(numerator / denominator);
});
}
divide(5, 0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
- 用
resolve
/ reject
- 返回,因为回调的返回值被忽略,我们可以通过返回reject/resolve语句来保存一行:
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
return reject("Cannot divide by 0");
}
console.log('operation succeeded');
resolve(numerator / denominator);
});
}
divide(5, 0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
reject("Cannot divide by 0");
} else {
console.log('operation succeeded');
resolve(numerator / denominator);
}
});
}
divide(5, 0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
我更喜欢使用其中一个return
选项,因为代码更扁平。