promise

作者: jeanzy | 来源:发表于2020-03-02 01:15 被阅读0次

    回调地狱:上一个回调函数中继续做事情,而且在回掉函数中继续回调=》  异步请求不方便代码的维护

    promise的出现就是为了解决异步请求中的回调地狱问题 ,他是一种设计模式,ES6中提供了一个内置类Promise,来实现这种设计模式。

    new Promise([executor])

        [executor] 执行函数必须是传递的

    Promise 是用来管理异步编程的 它本身不是异步的 new Promise的时候会立即把exector函数执行(只不过我们一般会在exector函数中处理一个异步操作)

    promise 本身有三个状态  =>[[PromiseStatus]]

        1.padding 初始状态

        2.fulfilled    代表操作成功 (resolved)

        3.rejected 代表操作失败

    promise 本身有一个value值,用来记录成功的结果(或者失败的原因的)=>[[PromiseValue]]

    let p1 = new Promise((resolve, reject) => {

                setTimeout(_ => {

                    // 一般会在异步操作结束后,执行resolve/reject函数,执行这两个函数中的一个,都可以修改Promise的[[PromiseStatus]]/[[PromiseValue]]

                    // 一旦状态被改变,再执行resolve、reject就没有用了

                    resolve('ok');

                    reject('no');

                }, 1000);

            });

    // new Promise的时候先执行executor函数,在这里开启了一个异步操作的任务(此时不等:把其放入到EventQuque任务队列中),继续执行

            // p1.then基于THEN方法,存储起来两个函数(此时这两个函数还没有执行);当executor函数中的异步操作结束了,基于resolve/reject控制Promise状态,从而决定执行then存储的函数中的某一个

    // THEN:设置成功或者失败后处理的方法

    // Promise.prototype.then([resolvedFn],[rejectedFn])

    PROMISE中唯一的异步操作

    // resolve/reject 的执行,不论是否放到一个异步操作中,都需要等待then先执行完,把方法存储好,才会在更改状态后执行then中对应的方法 =>此处是一个异步操作(所以很多人说PROMISE是异步的),而且是微任务操作

    //=>创建一个状态为成功/失败的PROMISE实例 

            // 这样的写法也可以被这种写法代替 

            // => Promise.resolve(100)

            // => Promise.reject(0)

    let p1 = new Promise((resolve, reject) => {

                resolve(100);

            });

    * THEN方法结束都会返回一个新的Promise实例(THEN链)

             *   [[PromiseStatus]]:'pending'

             *   [[PromiseValue]]:undefined

    * p1这个new Promise出来的实例,成功或者失败,取决于executor函数执行的时候,执行的是resolve还是reject决定的,再或者executor函数执行发生异常错误,也是会把实例状态改为失败的

             * 

             * p2/p3这种每一次执行then返回的新实例的状态,由then中存储的方法执行的结果来决定最后的状态(上一个THEN中某个方法执行的结果,决定下一个then中哪一个方法会被执行)

             *   =>不论是成功的方法执行,还是失败的方法执行(THEN中的两个方法),凡是执行抛出了异常,则都会把实例的状态改为失败

             *   =>方法中如果返回一个新的PROMISE实例,返回这个实例的结果是成功还是失败,也决定了当前实例是成功还是失败

             *   =>剩下的情况基本上都是让实例变为成功的状态 (方法返回的结果是当前实例的value值:上一个then中方法返回的结果会传递到下一个then的方法中)

             */

            /* let p1 = new Promise((resolve, reject) => {

                resolve(100);

            });

            let p2 = p1.then(result => {

                console.log('成功:' + result);

                return result + 100;

            }, reason => {

                console.log('失败:' + reason);

                return reason - 100;

            });

            let p3 = p2.then(result => {

                console.log('成功:' + result);

            }, reason => {

                console.log('失败:' + reason);

            }); */

    // TEHN中也可以只写一个或者不写函数

            // .then(fn)

            // .then(null,fn)

            // 遇到一个THEN,要执行成功或者失败的方法,如果此方法并没有在当前THEN中被定义,则顺延到下一个对应的函数

    // Promise.prototype.catch(fn)等价

            // ===> .then(null,fn)

    /* 

    Promise.all(arr):

         返回的结果是一个PROMISE实例(ALL实例),要求ARR数组中的每一项都是一个新的PROMIE实例,PROMISE.ALL是等待所有数组中的实例状态都为成功才会让“ALL实例”状态为成功,VALUE是一个集合,存储着ARR中每一个实例返回的结果;凡是ARR中有一个实例状态为失败,“ALL实例”的状态也是失败

    // 返回的结果是按照ARR中编写实例的顺序组合在一起的

     Promise.race(arr):

    和ALL不同的地方,RACE是赛跑,也就是ARR中不管哪一个先处理完,处理完的结果作为“RACE实例”的结果

    async / await

    ES7中提供了PROMISE操作的语法糖:async / await

    ASYNC 是让一个普通函数返回的结果变为STATUS=RESOLVED并且VALUE=RETRN结构的PROMISE实例 

    ASYNC 最主要的作用是配合AWAIT使用的,因为一旦在函数中使用AWAIT,那么当前的函数必须用ASYNC修饰

    AWAIT会等待当前PROMISE的返回结果,只有返回的状态是RESOLVED情况,才会把返回结果赋值给RESULT

    AWAIT不是同步编程,是异步编程(微任务):当代码执行到此行(先把此行),构建一个异步的微任务(等待PROMISE返回结果,并且AWAIT下面的代码也都被列到任务队列中),

    如果PROMISE是失败状态,则AWAIT不会接收其返回结果,AWAIT下面的代码也不会在继续执行(AWAIT只能处理PROMISE为成功状态的时候

    相关文章

      网友评论

          本文标题:promise

          本文链接:https://www.haomeiwen.com/subject/qbnhkhtx.html