YanTianFeng的知识库

Want Coding

Want Reading

文章 89

访问 18443

评论 2

头像

YanTianFeng

发私信

文章 89
访问 18443
评论 2
Technology and Code
返回顶部

Knowledge  Promise总结

标签   promise  

  ( 13 )       ( 0 )


Promise 总结

说明

Promise 是一个构造函数,自己身上有 call 、 resolve 、 reject ,原型上有 then 、 catch 等方法。

Promise 对象有以下两个特点

1. 对象的状态不受外界影响。有三种状态: Pending (进行中)、 Resolved (已完成,又称 Fulfilled )和 Rejected (已失败)

2. 一旦状态改变,就不会再变,任何时候都可以得到这个结果。 Promise 对象的状态改变,只有两种可能:从 Pending 变为 Resolved 和从 Pending 变为 Rejected

function runAsync(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('执行完成');
            resolve('随便什么数据');
        }, 2000);
    });
    return p;            
}
runAsync().then(function(data){
    console.log(data);
    //后面可以用传过来的数据做些其他操作
    //......
});

表面上看 Promise 只是简化层层的回调写法,实质上, Promise 的精髓是状态

链式操作的用法

function runAsync1(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步任务1执行完成');
            resolve('随便什么数据1');
        }, 1000);
    });
    return p;            
}
function runAsync2(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步任务2执行完成');
            resolve('随便什么数据2');
        }, 2000);
    });
    return p;            
}
function runAsync3(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步任务3执行完成');
            resolve('随便什么数据3');
        }, 2000);
    });
    return p;            
}
runAsync1()
.then(function(data){
    console.log(data);
    return runAsync2();
})
.then(function(data){
    console.log(data);
    return runAsync3();
})
.then(function(data){
    console.log(data);
});

reject 的用法

reject 的作用就是把 Promise 的状态置为 rejected ,这样我们在 then 中就能捕捉到,然后执行“失败”情况的回调

then 方法可以接受两个参数,第一个对应 resolve 的回调,第二个对应 reject 的回调。

var promise = new Promise((resolve, reject) => {
    reject('失败')
})
promise.then((data) =>{
    console.log('success:' + data)
},(reason) => {
    console.log('error:' + reason);
})

catch 的用法

catch 方法,他和 then 的第二个参数一样,用来指定 reject 的回调。但是他还有一个作用:当在执行 resolve 的回调时候,如果出现异常那么 js 不会卡死,而是会进入到 catch 方法中

function getNumber(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            var num = Math.ceil(Math.random()*10); //生成1-10的随机数
            if(num<=5){
                resolve(num);
            }
            else{
                reject('数字太大了');
            }
        }, 2000);
    });
    return p;            
}
getNumber()
.then(function(data){
    console.log(data);
    console.log(somedata); //此处的somedata未定义
}).then((data) =>{
    console.log('success:' + data)
},(reason) => {
    console.log('error:' + reason);
})
.catch(function(reason){
    console.error(reason);
});

all 的用法

Promise 的 all 方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调

Promise
.all([runAsync1(), runAsync2(), runAsync3()])
.then(function(results){
    console.log(results);
});

race 的用法

Promise
.race([runAsync1(), runAsync2(), runAsync3()])
.then(function(results){
    console.log(results);
});

finally

finally 方法用于指定不管 Promise 对象最后状态如何,都会执行的操作

promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});