返回的目的是在被拒绝后终止函数的执行,并防止在被拒绝后代码的执行。
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);
});
}
在这种情况下,它阻止了解析(分子/分母);从执行,这不是严格需要的。但是,最好还是终止执行,以防止将来可能出现陷阱。此外,防止运行不必要的代码是一个很好的实践。
背景
承诺可以是三种状态之一:
Pending -初始状态。我们可以从待定状态转移到其他状态
圆满——成功运营
拒绝—操作失败
当一个承诺被履行或被拒绝时,它将无限期地保持这种状态。因此,拒绝一个已实现的承诺或履行一个已被拒绝的承诺,都不会有效果。
这个例子片段表明,虽然承诺在被拒绝后得到了实现,但它仍然被拒绝。
函数除法(分子,分母){
返回新的承诺((resolve, reject) => {
如果(分母=== 0){
拒绝(“不能除0”);
}
Resolve(分子/分母);
});
}
分(5,0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
那我们为什么要回去呢?
虽然我们不能改变已解决的承诺状态,但拒绝或解决不会停止函数其余部分的执行。该函数包含的代码可能会产生令人困惑的结果。例如:
函数除法(分子,分母){
返回新的承诺((resolve, reject) => {
如果(分母=== 0){
拒绝(“不能除0”);
}
console.log(“操作成功”);
Resolve(分子/分母);
});
}
分(5,0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
即使函数现在不包含这样的代码,这也可能在将来创建一个陷阱。未来的重构可能会忽略这样一个事实,即在承诺被拒绝后代码仍在执行,并且很难调试。
执行完resolve/reject后停止执行:
这是标准的JS控制流。
解析/拒绝后返回:
函数除法(分子,分母){
返回新的承诺((resolve, reject) => {
如果(分母=== 0){
拒绝(“不能除0”);
返回;
}
console.log(“操作成功”);
Resolve(分子/分母);
});
}
分(5,0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
返回resolve / reject -由于回调的返回值被忽略,我们可以通过返回reject/resolve语句来保存一行:
函数除法(分子,分母){
返回新的承诺((resolve, reject) => {
如果(分母=== 0){
return reject("不能除0");
}
console.log(“操作成功”);
Resolve(分子/分母);
});
}
分(5,0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
使用if/else块:
函数除法(分子,分母){
返回新的承诺((resolve, reject) => {
如果(分母=== 0){
拒绝(“不能除0”);
}其他{
console.log(“操作成功”);
Resolve(分子/分母);
}
});
}
分(5,0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
我更喜欢使用返回选项之一,因为代码更平坦。