一尘不染

需要在提前解决/拒绝后返回吗?

javascript

假设我有以下代码。

function divide(numerator, denominator) {
 return new Promise((resolve, reject) => {

  if(denominator === 0){
   reject("Cannot divide by 0");
   return; //superfluous?
  }

  resolve(numerator / denominator);

 });
}

如果我的目的是要reject早退,那么我是否也应该养成return事后立即饮食的习惯?


阅读 279

收藏
2020-05-01

共1个答案

一尘不染

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);执行,这不是严格需要的。但是,仍然最好终止执行以防止将来可能出现陷阱。另外,防止不必要地运行代码是一个好习惯。

背景

一个承诺可以处于以下三种状态之一:

  1. 待定-初始状态。从待定状态可以移至其他状态之一
  2. 完成-成功运作
  3. 拒绝-操作失败

当一个诺言被兑现或被拒绝时,它会无限期地保持这种状态(结算)。因此,拒绝履行承诺或履行拒绝承诺将不会产生效果。

此示例代码片段显示,尽管诺言在被拒绝后就已实现,但它仍然被拒绝。

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));

那么,为什么我们需要返回?

尽管我们无法更改已结算的承诺状态,但拒绝或解决不会停止其余功能的执行。该函数可能包含会产生混乱结果的代码。例如:

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));

即使函数现在不包含此类代码,这也会造成将来的陷阱。将来的重构可能会忽略以下事实:承诺被拒绝后,代码仍在执行,并且将很难调试。

解析/拒绝后停止执行:

这是标准的JS控制流程内容。

  • resolve/ 之后返回reject

    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));

  • 使用if / else块:

    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选项,因为代码比较扁平。

2020-05-01