Promise对象详解

1.简介

Promise是抽象异步处理对象以及对其进行各种操作的组件。


2.对象状态

Promise对象有2种状态:

  • promise对象被 resolve 时的处理(onFulfilled)

  • promise对象被 reject 时的处理(onRejected)

Promise对象详解_第1张图片

3.创建Promise对象

创建一个Promise对象一般分为2步:
a.new Promise(function(resolve,reject){
        //业务逻辑
        //处理结果正确就调用resolve方法
        //处理逻辑错误叫调用reject方法
})

b.调用Promise实例的then()、catch()方法,异步处理完成就执行then方法,处理异常就执行catch方法。

function aysncTest(){
   return new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve('Async Hello world');
        }, 16);
    })
}

aysncTest().then(function (value) {
    console.log(value);    // => 'Async Hello world'
}).catch(function (error) {
    console.log(error);
})

4.Promise方法

4.1实例方法

then(fn):该方法是用来注册Promise实例的状态为onFulfilled时的回调函数。

catch(fn):该方法是用来注册Promise实例的状态为onRejected时的回调函数,它其实是promise.then(undefind,onRejected)的另一种写法而已。

Pormise对象支持链式写法,在链式写法中每个then的执行都是同步,不是链式写法则then的执行是异步的。
var promise = new Promise(function (resolve){
    console.log("inner promise"); // 1
    resolve(42);
});
promise.then(function(value){
    console.log(value); // 2
}).then(function(value="outer promise" ){
    console.log(value); // 3
    return value;
}).catch(function(error){
    console.log(error); // 3
    return error;
}).then(function(value){
    console.log(value); // 4
});

//执行结果:
//inner promise
//42
//outer promise
//outer promise


注意:then和catch返回的都是一个全新的Promise对象,在执行这两个方法后,不论返回的数据类型是什么,都会被包装成一个全新的Promise对象。返回的数据会传递到下一个链式方法里作为参数。

4.2静态方法

Promise.resolve(value):使promise对象立即进入onResolved状态,并且将value参数传给then方法。相当于如下代码:
new Promise(function (resolve){
    resolve(value);
});
resolve方法还能将thenable(具有then方法的对象)转换为Promise对象,但是需要注意的是:两个对象的then必须有同样的机制和处理流程,否则会导致部分信息丢失,
例如:jQuery.ajax()的返回值就具有then方法,但是2者机制不同,强转的话就会导致部分信息不完整。


Promise.reject(error):使promise对象立即进入onRejected状态,并且将error参数传给catch方法。相当于如下代码:
new Promise(function(resolve,reject){
    reject(error);
});

Promise.all(array):接收一个 promise对象的数组作为参数,当这个数组里的所有promise对象全部变为resolve或reject状态的时候,它才会去调用  .then 方法。
var promise1 = new Promise(function (resolve){
    resolve("promise1 is resolve");
});
var promise2 = new Promise(function (resolve){
    resolve("promise2 is resolve");
});

function main(){
    return Promise.all([promise1,promise2])
}
main().then(function(value){
    console.log(value)
})
//执行结果:
//["promise1 is resolve", "promise2 is resolve"]

Promise.race(array): 接收一个 promise对象的数组作为参数,当这个数组里只要有一个promise对象进入reject状态的时候,它才会去调用  .then  方法。

// `delay`毫秒后执行resolve
function timerPromisefy(delay) {
    return new Promise(function (resolve) {
        setTimeout(function () {
            resolve(delay);
        }, delay);
    });
}
// 任何一个promise变为resolve或reject 的话程序就停止运行
Promise.race([
    timerPromisefy(1),
    timerPromisefy(32),
    timerPromisefy(64),
    timerPromisefy(128)
]).then(function (value) {
    console.log(value);    // => 1
});

你可能感兴趣的:(ES6)