为了账号安全,请及时绑定邮箱和手机立即绑定

早日解决/拒绝后是否需要返回?

早日解决/拒绝后是否需要返回?

HUH函数 2019-12-12 13:07:33
假设我有以下代码。function divide(numerator, denominator) { return new Promise((resolve, reject) => {  if(denominator === 0){   reject("Cannot divide by 0");   return; //superfluous?  }  resolve(numerator / denominator); });}如果我的目的是要reject早退,那么我是否也应该养成return事后立即饮食的习惯?
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

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


背景


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


待定-初始状态。从待定状态,我们可以移至其他状态之一

完成-成功运作

拒绝-操作失败

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


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


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


查看完整回答
反对 回复 2019-12-12
?
茅侃侃

TA贡献1842条经验 获得超21个赞

从技术上讲,这里不需要1-因为Promise可以排他或仅一次地被解决或拒绝。第一个Promise结局获胜,随后的每个结果都将被忽略。这是不同的节点样式的回调。

话虽这么说,优良作法是确保在实际可行的情况下(在这种情况下)确实要正确调用一个,因为没有进一步的异步/延迟处理。“尽早返回”的决定与在其工作完成时结束任何功能没有什么不同 -继续进行无关或不必要的处理。

在适当的时间返回(或使用条件语句以避免执行“其他”情况)减少了意外地在无效状态下运行代码或执行不良副作用的机会;因此,它使代码不太容易“意外中断”。


1这个技术上的答案还取决于这样一个事实,在这种情况下,“返回”之后的代码(如果应省略)不会产生副作用。JavaScript将愉快地除以零并返回+ Infinity / -Infinity或NaN。


查看完整回答
反对 回复 2019-12-12
  • 3 回答
  • 0 关注
  • 344 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号