当前位置: 首页 > 面试题库 >

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

锺离玮
2023-03-14
问题内容

假设我有以下代码。

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

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

  resolve(numerator / denominator);

 });
}

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


问题答案:

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



 类似资料:
  • 假设我有以下代码。 如果我的目标是使用提前退出,那么我是否也应该养成之后立即返回ing的习惯?

  • 所以我想知道promise的回应和拒绝对象是怎么回事。我正在阅读这份文档,有些事情我还不清楚。 例如,对象是关于什么的。 我已经看到这个东西可以包含在一个字符串中,然后启动?发生了什么事?这有什么意义 我最初认为只要回调函数返回一个值,解析函数/对象就会启动,然后它就可以转到 所以我在这件事上玩了一段时间,结果证明,我的理论中有50%的时间是有效的,另外50%的时间让我崩溃。 还有拒绝对象/函数,

  • 我在想什么时候我该拒绝一个promise。我发现了几个关于这个话题的问题,但找不到合适的答案。我什么时候应该拒绝promise? 本文http://howtonode.org/6666a4b74d7434144cff717c828be2c3953d46e7/promises 说: 解析:一个成功的promise是“已解析”的,它调用正在等待的成功侦听器,并记住为附加的未来成功侦听器解析的值。分辨率

  • 最近,我们突然看到以下几个堆栈跟踪。为什么会这样?这是从应用程序尝试将音频评论服务移动到前台时开始的,包括媒体通知和所有内容。

  • 问题内容: 考虑一下这个功能: 有人可以解释一下为什么L1和L2显然无法到达时没有给出警告,而L3却给出了警告。 问题答案: 因为就编译器而言,这只是另一个方法调用。 它所做的是结束过程这一事实只能从实现中找到(这是本机代码,而没有任何区别)。 如果你必须把你的代码(通常也最好避免它,除非你想返回0以外的代码),它应该是一个方法,返回,例如。这样更好。 关于可达性,解释是相同的:是Java语言的关

  • 问题内容: 我正在尝试编写一个返回诺言的函数。但是有时候,所请求的信息会立即可用。我想将其包装在一个承诺中,这样消费者就不必做出决定了。 并像这样使用它: 问题在于,对于预解析的Promise不会执行回调。这是合法的事情吗?有没有更好的方法来处理这种情况? 问题答案: 简短的答案:是的,您可以 在返回AngularJS承诺之前将其解析,并且其行为将与您期望的一样。 来自JB Nizet的Plunk