ES6(一):Promise对象

写在前面

这只是一篇本人在学习ES6过程中记录的笔记嘿嘿~

介绍Promise

promise的概念和实现最初来源于社区,用于解决异步编程的回调嵌套问题,即将多级的嵌套改良成顺序的代码行。ES6将其写入了语言标准,统一了用法,提供了原生的Promise。

Promise是一个构造函数,用于生成一个Promise实例。Promise实例代表一次异步操作。 它只可能有3种转态,分别是Pending(未决议), Resolved(完成)Rejected(出错)

创建一个Promise实例时,其处于Pending状态,当异步操作完成,执行回调函数的时候,根据回调函数中的err 的值,如果err 为空则异步操作成功,否则异步操作失败。此后,Promise实例的状态将不再改变。

Promise实例

var pro = function () {
    return new Promise(function(resolve, reject) {
        fs.readdir(_dirname, function(err, data) {
            if (err) {
                reject(err); //失败则将Promise对象置为rejected状态
            } else {
                resolve(data); //成功则将Promise对象置为resolved转态
            }
        });
    });
}
/*pro是一个函数
 调用该函数返回一个Promise实例
*/
var promiseObject = pro();
/*then方法执行Resolved和Rejected状态的回调函数*/
promiseObject
.then(doneCallbacks, failCallbacks)
.catch(function(err) { 
    console.log(err);
});

var doneCallbacks = function(data) {
    console.log(data);
};

var failCallbacks = function(err) {
    console.log(err)
};

catch是then的一个语法糖,相当于

promiseObject.then(undefined, function(err) {
    console.log(err)
});

Promise对象的错误具有向后传递的性质,因此,如果在调用过程抛出异常,则异常总能被最后一个catch捕获。这也是为什么我们习惯在then的调用后跟随一个catch调用。

then的链式写法

then 方法是定义在构造函数Promise 的原型对象上的。这个方法为Promise实例添加状态改变时的回调函数。then方法返回一个新的Promise实例,因此then方法后面可以调用then()方法。传给then()方法的函数,可返回三类值,分别如下:

  • 一个Promise实例
  • 一个普通值
  • 抛出一个异常

如果返回的是一个新的Promise对象,则下一级的then接收函数在这个Promise实例 状态发生改变时被触发执行。因此,then的链式写法,可以按顺序执行一系列的异步操作,并且后一个异步操作在前一个完成之后开始。如下代码实例所示:

var fs = require('fs');

var pro = function () {
    return new Promise(function(resolve, reject) {
        fs.readdir(_dirname, function(err, data) {
            if (err) {
                reject(err); //失败则将Promise对象置为rejected状态
            } else {
                resolve(data); //成功则将Promise对象置为resolved转态
            }
        });
    });
}
var newPro = function(data) {
    return new Promise(function(resolve, reject) {
        setTimeout(function(){
            resolve(data);
        },2000);
    });
};


/*pro是一个函数
 调用该函数返回一个Promise实例
*/
var promiseObject = pro();
/*then方法执行Resolved和Rejected状态的回调函数*/
promiseObject
    .then(function(data){
        console.log("fisrt sync op");
        console.log(data);
        return newPro(data);//返回一个新的Promise对象
    })
    .then(function(data) {
        console.log("second sync op");
        console.log(data);//两秒钟后才会被执行
    })
    .catch(function(err) { 
        console.log(err);
    });

promiseObject.then(undefined, function(err) {
    console.log(err)
});

var doneCallbacks = function(data) {
    console.log(data);
};

var failCallbacks = function(err) {
    console.log(err)
};

把上一级异步调用的结果返回给下一级调用,then这样的链式写法,解决了回调函数的多层嵌套调用。

解决异步嵌套回调的更多方案

“回调金字塔”

多层嵌套

bluebird库 + Generator

待学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值