https://www.jianshu.com/p/dc61ea153874
promise出现的目的一为处理JavaScript里的异步,再就是避免回调地狱,解决异步深层嵌套的问题。

Promise是什么
Promise 是异步编程的一种解决方案,其实是一个构造函数,自己身上有all、reject、resolve这几个方法,原型上有then、catch等方法。

Promise 三种状态
pending、fulfilled、rejected(未决定,履行,拒绝),同一时间只能存在一种状态,且状态一旦改变就不能再变。promise是一个构造函数,promise对象代表一项有两种可能结果(成功或失败)的任务,它还持有多个回调,出现不同结果时分别发出相应回调。

1.初始化,状态:pending等待中

2.当调用resolve(成功),状态:pengding=>fulfilled已完成

3.当调用reject(失败),状态:pending=>rejected已拒绝

Promise的特点
1.Promise对象的状态不受外界影响,Promise对象代表一个异步操作,有三种状态:pending(进行中),fulfilled(已成功),rejected(已失败).只有异步操作的结果可以决定当前是哪一种状态,任何其他操作都无法改变这个状态
2.一旦状态改变,就不会再变,任何时候都是这样.Promise对象的状态改变只有两种可能:从pending变为fulfilled和从pending变为rejected,只要处于 fulfilled 和 rejected ,状态就不会再变了即 resolved(已定型)。

Promise的缺点
1.无法取消 Promise ,一旦新建它就会立即执行,无法中途取消。
2.如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。
3.当处于 pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)

Promise的基本用法
有两个参数resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。

       const p = new Promise(function(resolve,reject){
           /*if(异步操作成功){
                  resolve(value);
           }else{
                  reject(error);    
           }
           */
       }); 
       //通过then方法添加的回调函数,接收两个函数作为参数,第一个参数是 Promise 执行成功时的回调,
       //第二个参数是 Promise 执行失败时的回调,两个函数只会有一个被调用。
       p.then(function(value){  
           console.log(value); 
       },function(err){
           console.log(err); 
       });

then方法

     let p = new Promise((resolve, reject) => {
         setTimeout(function(){
                 var num = Math.ceil(Math.random()*10); 
                 if(num<=5){
                     resolve(num);
                 }else{
                     reject('数字不满足条件');
                 }
         }, 1000);
     });
     p.then((data) => {
             console.log('resolved',data);
         },(err) => {
             console.log('rejected',err);
         }
     );

then方法可以链式操作

    p.then((data) => {
        console.log(data);
    })
    .then((data) => {
        console.log(data);
    })
    .then((data) => {
        console.log(data);
    });

catch方法
用来指定reject的回调

    p.then((data) => {
        console.log('resolved',data);
    }).catch((err) => {
        console.log('rejected',err);
    });

还有另外一个作用:在执行resolve的回调(也就是then中的第一个参数)时,如果抛出代码出错了,那么并不会报错卡死js,而是会进到这个catch方法中。

Promise的好处
解决了回调地狱,使异步编程更加简单,代码更加简洁、清晰明了,Promise的扁平化设计,加强了代码的可维护性,对代码的可阅读性有了很大的提升