Promise对象详解

来源:互联网 发布:淘宝照片拍摄技巧 编辑:程序博客网 时间:2024/05/14 17:56

1.简介

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


2.对象状态

Promise对象有2种状态:

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

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



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`毫秒后执行resolvefunction 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});

原创粉丝点击