对Promise的深情,只好浅谈
谢时间拈了眉头的霜花,谢沧桑 喂饱思念的马,谢绵长情话 投射了天涯,带我去探索Promise,让偶在红尘中,啊,不,在Promise中醉一下。
回调的前世今生,让你再见不必害怕
我相信当每个人遇到Promise的那一刻,在你身上产生了一种由内而发的情感,叫作承诺,叫作心动。那么,故事就由此开始了。
故事的发生产生的一个行为,包括了三个阶段
阶段1:什么是Promise?
Promise是基于es6的,在之前的版本中是没有的,像koa中的generator,还有后来的async、await、axios 、redux-saga,要想深入理解运用,Promise是关键,那么Promise到底怎么理解呢?
Promise本意是承诺,在程序中的理解呢,就是它是一种异步流程的控制手段,我们都知道js中常见异步有:定时器,callback,ajax请求,那怎么理解异步呢?古人云:“君子一言,驷马难追!”,这句话,就是形容,一个人答应另一个人,在将来一定会实现的诺言,就是Promise要做的事情。简而言之,异步就是,过一段时间确认必须要做的事情。
阶段2:Promise的三个状态
- Pending: Promise对象实例创建时候的初始状态
- Fulfilled可以理解为成功的状态
- Rejected可以理解为失败的状态
- then方法就是用来指定Promise对象的状态改变时确定执行的操作,resolve时执行第一个函数(onFulfilled),reject时执行第二个函数(onRejected).
- Promise只有一个参数,叫excutor执行器,默认new时就会调用
下面我们来看一段代码:
Let p = new Promise((resolve, reject) => {
// 默认promise中的executor是同步执行的
resolve(‘成功的回调’);
//reject(’失败的回调’);
});
p.then((value) => { // vlaue成功的原因
console.log(value); // ‘成功的回调’
},(err)=>{ //err失败的原因
console.log(err); // ’失败的回调’
})
阶段3:Promise解决回调地狱
首先,先解释一下什么是回调地狱,我们经常会遇到这样的情况:一个接口的参数会需要使用另一个接口获取,之前通常采取的方法,就是ajax里面嵌套ajax,这样做也能解决此问题,但是给开发者还来了痛苦的回忆,而且用户体验极差,现在,我们终于迎来了Promise的时代,它完美的解决了回调地狱。
下面我们来看一下,它的实现方式:
let fs = require('fs');
function read(file){
return new Promise(function(resolve,reject){
fs.readFile(file,'utf8',function(err,data){
if (err) {
return reject(err);
}
resolve(data);
})
})
}
read('./1.txt').then(function(data){
return read(data);
}).then(function(data){
console.log(data);
}).catch(function(err){
console.log(err)
})
当第一个then中返回一个promise,会将返回的promise的结果,传递到下个then中。这就是比较著名的链式调用了。
好了,到这里,故事接近尾生啦,希望通过上述的三点,让大家能对promise有一个简单的了解,想知道Promise的更多内容吗?请继续关注我给大家带来的后续文章。