阅读 208

Promise全攻略(一.Promise的出现为了解决什么问题)

Promise是异步任务同步化的解决方案?本文讲通过以下几方面来介绍Promise:

  1. Promise的出现为了解决什么问题
  2. Promise内部对任务的处理
  3. Promise的标准规范
  4. Promise的方法使用
  5. Promise在eventLoop中执行顺序
  6. 源码地址

Promise知识分五个章节来阐述,这篇我们讨论:Promise的出现为了解决什么问题

一.Promise的出现为了解决什么问题

  • 解决回调地狱问题
  • 解决信任问题
  • 解决捕获错误能力
  • 解决多个任务回调后导致多件事情顺序执行,性能消耗过多
解决回调地狱问题

首先我们要了解什么是回调函数:
回调函数指的是:被调用者回头调用调用者的函数,这种由调用方自己提供的函数叫回调函数。
“回调”在JS中应用最多的场景当然就是异步编程了。“回调地狱”的嵌套就是指异步嵌套例如

setTimeout(()=>{
    doSomething();
    setTimeout(){
        doSomething();
        setTimeout(){
            doSomething();
            setTimeout(){
                doSomething();
            },1000};
        },1000};
    },1000};
,1000);
复制代码

这种层层嵌套,回调套回调这样不利于阅读,而Promise相当于把每个执行后的结果顺序的列出,开发者不需要记原有的执行顺序。(异步过程同步化) 同时这种“回调地狱”会引发别的问题那就是信任问题

解决信任问题

就异步请求来讨论,GitHub上或自己都会有对xhr进行封装,例如Ajax,这些封装的第三方库的回调是否真的可靠呢?
对成功或失败等回调能保证只调用一次吗?如果不,就会产生很多问题,比如

  • 回调过早(一般是异步被同步调用)
  • 回调过晚或没有回调
  • 回调次数过多
  • 等等

它的问题的根源在于控制反转,在回调中控制权交给了第三方,由第三方决定什么时候调用回调以及如何调用。虽然这些错误出现的概率不大,但我们依然必须要处理。这时这种解决方案就显得尤为重要。
Promise并没有取消控制反转,而是把反转出去的控制再反转一次,也就是反转了控制反转。
Promise有这些特征:
1.只能决议一次,决议值只能有一个,决议之后无法改变。
2.任何then中的回调也只会被调用一次。
所以Promise的特征保证了Promise可以解决信任问题。

解决捕获错误能力

这里我理解的捕获错误的能力并不是有错误的回调,非Promise也有对错误回调的调用。Promise会把会导致js解析失败,报错异常的语句统一放到自己的错误回调中,并以传参的形式表现出来。举例说明:

p.then(res => {
    console.log('这是resovle的回调.then方法', res);
    console.log(undefinedData) //未定义的变量
})
.catch(reason => {
    console.log('这是reject的回调.catch方法', reason);
})
复制代码

在.then这个回调中我们执行了一个未定义的值,这时js解释器本应该找不到此值并抛出Uncaught ReferenceError: undefinedData is not defined,但在.then中并不会导致程序无法正常解析,而是向下传递给.catch方法,并把错误信息传给reason参数中。这种行为与处理同步任务的try/catch是同一种功能。


如果此文章对您有帮助或启发,那便是我的荣幸

文章分类
前端
文章标签