三. 为什么要用Promise
发布日期:2021-05-27 05:11:40 浏览次数:22 分类:精选文章

本文共 1780 字,大约阅读时间需要 5 分钟。

为什么要用 Promise/*1. 指定回调函数的方式更加灵活

传统的回调方式存在一定局限性,常见的做法是在启动异步任务前指定回调函数。这意味着回调函数只在异步任务完成后才能执行,可以更灵活地绑定甚至在异步任务完成后指定。这与传统的方式相比,优点明显。

另一个重要的优势是支持链式调用,这一点不足以说明问题的严重性。回调地狱的概念实际上指的是多个回调函数嵌套调用,外部回调函数的依赖关系导致并发执行,最终只能是顺序执行。这种嵌套方式会导致代码难以阅读,错误处理也变得更加复杂。回调地狱的主要缺点在于不便于阅读和异常处理。

传统的回调方式难以有效地进行错误处理和代码维护。解决回调地狱问题的终极方案是使用async/await,因为它能够彻底缓解回调地狱带来的问题。

回调地狱的具体表现

让我们看看下面这段代码的回调地狱现象:

doSomething(function(result) {  doSomethingElse(result, function(newResult) {    doThirdThing(newResult, function(finalResult) {      console.log('Got the final result:' + finalResult)    }, failureCallback)  }, failureCallback)}, failureCallback)

这里可以看出,外层函数的回调依赖于内部函数的执行结果,形成了一种复杂的嵌套关系。如果一个回调函数中调用另一个回调函数,随之ector需要等待其执行完才会继续下一个。这使得代码不仅难以阅读,还会导致性能问题,因为每个回调都会被放在任务队列中等待执行。

使用 Promise 链式调用解决回调地狱

通过使用 Promise 的链式调用,我们可以避免回调地狱的问题。以下是一个典型的实现示例:

doSomething().then(function(result) {  return doSomethingElse(result)}).then(function(newResult) {  return doThirdThing(newResult)}).then(function(finalResult) {  console.log('Got the final result:' + finalResult)}).catch(function(error) {  failureCallback(error)})

这种方式简洁明了地展示了代码的执行流程,避免了多层嵌套的复杂性。每一个 .then() 代表一个等待装层,保证了代码的可读性和调试性。

async/await:回调地狱的终极解决方案

async/await 等待接口提供了一种更加简洁和直观的方式去处理异步操作。以下是一个使用 async/await 的示例:

async function request() {  try {    const result = await dosomething();    const newResult = await doSomethingElse(result);    const finalResult = await doThirdThing(newResult);    console.log('Got the final result:' + finalResult);  } catch (error) {    failureCallback(error);  }}

这种写法不仅解决了回调地狱问题,还使得代码更加简洁易读。使用 async keyword标记函数为 facultative-async 函数,返回 Promise 对象。利用 await 关键字,可以对 Promise 对象进行 awaiting 操作,等价于等待其完成。这使得代码看起来更像是顺序执行的同步代码,极大地提升了可读性和可维护性。

总结而言,传统的回调方式虽然简单,但在复杂的分层逻辑中容易导致回调地狱问题。而 Promise 的链式调用和 async/await 提供了一种更高级的解决方案,充分解决了回调地狱带来的问题。

上一篇:四. 几个Promise常用API的介绍与使用
下一篇:二.什么是Promise

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月29日 12时14分43秒