Promise是一部编程的一种解决方案,

简单说就是一个容器,里面保存着么某个未来才会结束的事件(通常是一个异步操作)的结果

是为了简化异步对象,解决地狱回调情况

Promise:有两个回调函数:resolve:将对象的状态从未完成变成成功

           :reject:将对象的状态从未完成变成失败

 

下面的代码是展示一个Promise的简单异步调用:

            var p = new Promise(function(resolve,reject){
                //做一些异步操作
                setTimeout(function(){
                    console.log("执行完毕!");
                    resolve("成功!");
                },2000);
            });
            //调用
            p.then(function(add){
                console.log(add);
            });

 

下面是封装一个简单的Promise:

function pro(){
                let p = new Promise(resolve,reject){
                    setTimeout(function(){
                        console.log("执行完毕!");
                        resolve("成功!");
                    },2000);
                } 
                return p;
            }
            pro().then(function(data){
                console.log(data);
            })

then:可以接受两个回掉函数作为参数,(成功回调)和(失败回调),其中失败回调可选,这两个参数都接受Promise传出的值作为参数

resolve的用法把Promise的状态置为rejected,这样就能在then中捕获到,然后执行 “失败” 情况的回调

            function getName(){
                var p = new Promise(function(resolve,reject){
                    setTimeout(function(){
                        var num = Math.ceil(Math.random()*10);
                        if(num>5){
                            resolve(num);
                        }else{
                            reject("数字大于5了!");
                        }
                    },2000);
                })
                return p;
            };
            getName().then(function(data){
                console.log(resolve);
                console.log(data);
            },function(reject,data){
                console.log(reject);
                console.log(data);
            });

 

Promise.catch()方法是捕获错误的,用于指定发生错误时的回调函数

下面的一段代码:

primose.then(val=>{
                console.log("成功",val);
            }).catch(err=>{
                console.log("失败",err);
            })

Promise。all()    吧Promise打包,扔到一个数组里面。打包完还是一个Promise对象,必须确保所有的Promise对象,都是resolve对象,都是成功的状态

即:将多个Promise实例,包装才能一个新的Promise实例

var P = new Promise([p1,p2,p3]);

Promise.all()方法接受一个数组作为参数,p1,,p2,p3都是Promise对象的实例,如果不是就会 先调用Promise的resolve方法,将参数转换化Promise实例,在进一步处理

(改方法参数可以不是数组,但是必须具有iterator,且返回的每个成员都是Promise实例)

Promise.race() 同样是将多个Promise实例,包装成一个新的Promise实例

var P = new Promise([p1,p2,p3]);

上面的代码中p1,p2,p3,三个中有一个实例率先改变状态,P的状态就会跟着改变

跟上面你的Promise.all()一样,如果不是Promise实例,就会调用Promise的resolve

            let fun1=()=>{
                return new Promise((resolve,reject)=>{
                    console.log("执行了方法1");
                });
            }
            let fun2=()=>{
                return new Promise((resolve,reject)=>{
                    console.log("执行了方法2");
                })
            }
            let fun3=()=>{
                return new Promise((resolve,reject)=>{
                    console.log("执行了方法3");
                })
            }
            const arr = [fun1(),fun2(),fun3()];
            Promise.all(arr).then(()=>{
                console.log("全部执行完毕!");
                //console.log(data)["执行了方法1","执行了方法2","执行了方法3",]
            });//如果三个方法里面的任何一个改变状态为reject,则报错

Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。

var promise1 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 500, 'one');
});

var promise2 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then(function(value) {
  console.log(value);
  // Both resolve, but promise2 is faster
});
// expected output: "two"