ES6学习笔记:Promise对象

Promise是异步编程的一种解决方案,从它可以获取异步操作的消息,Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。Promise对象状态有三种:进行中、已成功和已失败,状态一旦变化,就不能再改变。Promise对象创建语法:

//创建
const promise = new Promise(function(resolve, reject){});
//回调
promise.then(resolved, rejected);

resolve和reject是Javascript引擎定义好的函数,resolve用于将Promise对象的状态改为已成功,reject用于将Promise对象的状态改为已失败,需手工调用,它们都可以传出一个参数给回调函数。

resolved和rejected是回调函数,resolved在状态成功时被调用,rejected在状态失败时被调用,两个函数是可选的,不一定要提供,两个函数需自行编写,由系统调用。举个例子:

const todo = function(year){
    return new Promise(function(resolve, reject){
        if(year>1982){
            resolve("ok");
        }else{
            reject("error");
        }
    });
};

todo(1984).then(
    function(msg){console.log('resolved:'+msg)},
    function(msg){console.log('rejected:'+msg)}
);
//resolved:ok

then方法返回的是一个新的Promise实例(不是原来那个Promise实例),因此可以采用链式写法(上一个回调函数返回的结果继续传给下一个回调函数):

(new Promise((resolve, reject)=>{resolve(1)}))
.then((msg)=>{console.log(msg);return ++msg;})
.then((msg)=>{console.log(msg);return ++msg;})
.then((msg)=>{console.log(msg);return ++msg;})

Promise错误捕捉

上文说过,then方法的第二个参数可以用于捕捉错误:

(new Promise((resolve, reject)=>{throw 'error'})).then(
    (msg)=>{console.log('resolved:'+msg)},
    (msg)=>{console.log('rejected:'+msg)}
);
//rejected:error

但是,万一then方法里又发生了错误怎么处理呢?还有then链式写法时,每个then方法里重复一样的错误捕捉冗余又不美观,因此建议在最后用catch方法进行错误捕捉:

(new Promise((resolve, reject)=>{throw 'error'}))
.then()
.then()
.then()
.then()
.then()
.catch((msg)=>{console.log('rejected:'+msg)});
//rejected:error

(new Promise((resolve, reject)=>{resolve(1)}))
.then()
.then()
.then(()=>{throw 'error'})
.then()
.then()
.catch((msg)=>{console.log('rejected:'+msg)});
//rejected:error


评论: 0 | 引用: 0 | 查看次数: 1375
发表评论
登录后再发表评论!