JS:Promise Part1

JS:Promise Part1

回调函数

用于异步的请求

如花费一定时间加载一个脚本,在脚本加载完毕后调用回调函数,以此通知脚本加载完毕。

但是在异步的代码下面的代码,不会等待加载完毕才执行,而是会立即执行。这可能会出错,因为脚本还没有加载,因此将下面依赖脚本的代码加入到脚本的加载完成的回调中,这样执行顺序的问题就解决了。

加载多个脚本

加载多个脚本,则每一个脚本的加载过程都写在上一个脚本的加载的回调函数里,这样保证加载顺序。但这样的嵌套写法对于多个脚本(行为)比较复杂,可读性差。

error处理

加载脚本可能出错,我们需要对出错情况进行回调处理

Error优先回调 error-first callback

这是一种很普遍的回调方案

单一的回调函数拥有报错和传递成功结果的作用

callback(error,v1,v2);

第一个参数为error保留

之后的参数作为成功的结果参数

loadScript('#',function(error,scirpt){
    if(error){
        // 出错处理
    }
    else{
        // 成功
    }
})

回调地狱

可以看到,上述的回调方式如如果层次变深,代码将变得十分复杂,维护难度高,被称为回调地狱。
在这里插入图片描述

这样回调不断向右增长,也被称为厄运金字塔。

通过把每一次else中的回调拆分一个单独的有名函数,可以减轻上述情况,但这样可读性很差,重用性差。

更好的解决办法===》Promise

Promise

let promise = new Promise(function(resolve,rejected){
    resolve(123);
})

then

then 注册消费函数 可以注册成功resolved和错误error


catch

只注册错误,参数只有error

finally

settled后执行

  1. 没有参数
  2. 将结果和error传递给下一个处理程序

Promise 链

.then 会返回一个promise对象

这样我们就可以调用下一个then了

then 里面的return 就成为value 或error

我们可以promise.then;promise.then …

但这不是promise链,而是给最初的promise添加了几个不同的处理程序而已。而且他们的输入相同,都是promise的结果

Thenable 和Promise

下一个then不会等待Thenable 对象里的任务执行完

而会等待Promise里的任务执行完,才执行下一个then

典型例子:setTimeout 里直接return。下一个then拿到的值是undefined,因为没有等待定时任务结束就执行下一个then了。而如果return new Promise(resolve) 就会等待Promise内的任务执行完才执行下一个then

错误处理

只需在最后一个then后面加.catch ,因为error会一直被then传递到最后去被catch捕获。

throw error相当于reject,传递一个error出去。因为executor周围有隐式try…catch catch之后即变成rejected promise 传递出去

rethrow

error被catch之后又throw出去,被后面的catch捕获处理。

未处理的error

没有设置对应的catch去捕获错误

使用window.addEventListener(‘unhandledrejection’,function(e){

window.addEventListener('unhandledrejection',function(e){
            // 这个事件对象有两个特殊的属性:
              alert(event.promise); // [object Promise] - 生成该全局 error 的 promise
              alert(event.reason); // Error: Whoops! - 未处理的 error 对象
})

未被处理的错误都应该被这样捕获,否正应用程序就会”死掉“

注意throw错误虽然会被try catch 之后作为rejection 抛出,但是try catch 只能捕获同步的错误,所以如果有计时任务抛出异常,是无法被捕获到的,也就不能被外部的catch捕获。这是与reject(new Error) 不同的。

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页