promise失败,promise解决了什么意思

  promise失败,promise解决了什么意思

  本文将和大家分享使用promise时的五个常见错误,帮你快速避坑。希望对你有帮助!

  Promise提供了一种优雅的方式来处理JS中的异步操作。这也是避免“回调到地狱”的解决方法。但是,了解内容的开发者并不多。所以很多人在实践中经常出错。【相关推荐:javascript学习教程

  本文介绍了使用promise的五个常见错误,希望你能避免。

  1.避免 Promise 地狱

  通常,承诺是用来避免召唤回地狱的。但是滥用它们也会导致承诺成为地狱。

  用户登录(用户)。然后(功能(用户){

  getArticle(用户)。然后(功能(文章){

  showArticle(文章)。then(function(){

  //您的代码在这里.

  });

  });

  });在上面的例子中,我们为userLogin、getararticle和showararticle嵌套了三个promise。这样一来,复杂度会随着代码行数成比例增加,可能会变得不可读。

  为了避免这种情况,我们需要解开代码,从第一个then返回getArticle,然后在第二个then中处理它。

  用户登录(“用户”)。然后(getArticle)。然后(展示文章)。then(function(){

  //您的代码在这里.

  });2. 在 Promise 中使用 try/catch 块

  通常,我们使用try/catch块来处理错误。但是,不建议在Promise对象中使用try/catch。

  这是因为如果有任何错误,Promise对象将在catch中自动处理。

  新承诺((解决,拒绝)={

  尝试{

  const data=doThis();

  //做点什么

  resolve();

  } catch (e) {

  拒绝(e);

  }

  })。然后(data=console.log(data))。catch(错误=console.log(错误));在上面的例子中,我们在Promise中使用了try/catch块。

  然而,Promise本身会捕捉其范围内的所有错误(甚至是错别字),而不需要try/catch块。它确保在执行过程中抛出的所有异常都被捕获并转换为拒绝的承诺。

  新承诺((解决,拒绝)={

  const data=doThis();

  //做点什么

  解决()

  })。然后(data=console.log(data))。catch(错误=console.log(错误));注意:必须使用。承诺块中的catch()块。否则,您的测试用例可能会失败,并且应用程序可能会在生产阶段崩溃。

  3. 在 Promise 块内使用异步函数

  Async/Await是一种高级语法,用于处理同步代码中的多个承诺。当我们在函数声明之前使用async关键字时,它将返回一个承诺,我们可以使用await关键字来停止代码,直到我们等待的承诺被解决或拒绝。

  但是,当你把一个 Async 函数放在一个 Promise 块里面时,会有一些副作用。

  假设我们想在Promise块中做一个异步操作,所以我们使用async关键字,但是不幸的是,我们的代码抛出了一个错误。

  这样,即使我们使用catch()块或者在try/catch块内部等待您的承诺,我们也无法立即处理这个错误。请看下面的例子。

  //这段代码不能处理错误

  新承诺(async ()={

  抛出新错误(“消息”);

  }).catch(e=console . log(e . message));

  (async ()={

  尝试{

  等待新的承诺(async ()={

  抛出新错误(“消息”);

  });

  } catch (e) {

  console.log(电子邮件);

  }

  })();当我在Promise块中遇到异步函数时,我试图将异步逻辑放在Promise块之外以保持其同步性。10次有9次可以成功。

  但是,在某些情况下,可能需要异步函数。在这种情况下,别无选择,只能用try/catch块手动管理它。

  新承诺(异步(解决,拒绝)={

  尝试{

  抛出新错误(“消息”);

  } catch(错误){

  拒绝(错误);

  }

  }).catch(e=console . log(e . message));

  //使用异步/等待

  (async ()={

  尝试{

  等待新的承诺(异步(解决,拒绝)={

  尝试{

  抛出新错误(“消息”);

  } catch(错误){

  拒绝(错误);

  }

  });

  } catch (e) {

  console.log(电子邮件);

  }

  })();4.在创建 Promise 后立即执行 Promise 块

  至于下面的代码片段,如果我们把代码片段放在HTTP请求被调用的地方,它会被立即执行。

  const my Promise=new Promise(resolve={

  //发出HTTP请求的代码

  解决(结果);

  });原因是这段代码被包装在一个Promise构造函数中。但是,有些人可能认为只有在myPromise的then方法执行之后才会触发。

  然而,真相并非如此。相反,当一个Promise被创建时,回调被立即执行。

  这意味着当myPromise建立后到达下面一行时,HTTP请求可能已经在运行,或者至少处于预定状态。

  Promises 总是急于执行过程。

  但是,如果以后想执行承诺,该怎么办?如果我现在不想发出HTTP请求怎么办?承诺中有没有什么神奇的机制能让我们做到这一点?

  答案是使用函数。函数是一个耗时的机制。只有当开发人员用()显式调用它们时,它们才会被执行。简单的定义一个函数并不能给我们带来什么。所以,让Promise偷懒最有效的方法就是把它包装在一个函数里!

  const createMyPromise=()=新承诺(resolve={

  //HTTP请求

  解决(结果);

  });对于HTTP请求,Promise构造函数和回调函数只有在函数执行时才会被调用。所以现在我们有了一个懒惰的承诺,只有在需要的时候才会执行。

  5. 不一定使用 Promise.all() 方法

  如果你已经工作多年,你应该已经知道我在说什么了。如果有许多不相关的承诺,我们可以同时处理它们。

  承诺是并发的,但是如果一个一个的等,时间太长了。Promise.all()可以节省很多时间。

  const { promisify }=require( util );

  const sleep=promisify(setTimeout);

  异步函数f1() {

  等待睡眠(1000);

  }

  异步函数f2() {

  等待睡眠(2000年);

  }

  异步函数f3() {

  等待睡眠(3000);

  }

  (async ()={

  console . time(“sequential”);

  等待f1();

  await F2();

  await F3();

  console . time end( sequential );

  })();上述代码的执行时间约为6秒。但如果我们用Promise.all()代替,会减少执行时间。

  (async ()={

  console . time(“concurrent”);

  await Promise.all([f1(),f2(),F3()]);

  console . time end( concurrent );

  })();总结

  在这篇文章中,我们讨论了使用Promise时经常犯的五个错误。但是,可能还是有很多简单的问题需要认真解决。

  如有更多相关错误,欢迎留言讨论。

  有关编程的更多信息,请访问:编程入门!以上是快速避坑。下面就来说说使用promise的5个常见错误吧!更多详情请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: