接上篇文章:回调函数的嵌套可以让异步代码同步化,但是会造成回调地狱,如何解决。
Promise:
它是书写异步代码的另一种方式,可以解决回调地狱的嵌套问题。
它的状态有三个:pending(等待中)、fulfilled(也叫resolved,成功)、rejected(失败),怎么理解这三种状态呢,这里举个例子:
小明:排位吗,带我一个
小亮:你太坑了,老是不参团
小明:相信我,我的战术已经改进了,这把带你们躺赢一局下来:……
分析:小明说,这次带队友躺赢,是许下了承诺,这一局的过程是在等待结果。其中结果无非就两种,一是继续坑队友,导致失败,二是真的兑现承诺,带队友躺赢。
promise也是这样,允下个承诺,结果有可能是失败,也有可能是成功,这都是将来要发生的事情,也就是代码中的异步函数,一定时间后才会有结果,所以说promise是书写异步代码的一种方式。
promise基本语法:
1.创建promise对象
2.使用promise对象
const fs = require('fs')
// 创建promise对象
const p = new Promise(function(resolve,reject) {
//a.txt是要读取的本地文件,这个是node.js里面的fs模块读取文件的方法
fs.readFile('a.txt','utf8',(err,data)=>{
if(err) {
reject(err)
}else{
resolve(data)
}
})
})
// 使用promise对象 .then .catch
p.then(res =>{
console.log(res);
}).catch(err =>{
console.log(err);
})
其中,resolve和reject是promise内部提供的函数,resolve是成功的时候需要调用的函数;reject是失败的时候需要调用的函数。(重点)
promise中的.then和.catch的执行原理 --- promise状态的改变。
一旦创建promise实例对象,此时promise的状态就是pending,万物伊始,一切都是新的
当承诺兑现,promise的状态由pending改为resolved,使用promise的时候,就会自动进入.then的方法中,捕获到成功的数据
当承诺兑现失败,promise的状态由pending改为rejected,使用promise的时候,就会自动进入.catch的方法中,返回失败的结果。
而且使用promise对象的时候,.then下面不仅可以链接.catch,也可以链接下一个.then,执行下一个异步函数,形成链式结构,将异步函数同步进行,只有获得上一个结果之后才进行下一步操作,注意:一个异步代码出错,下面的都不执行,直接跳到.catch里抛出错误。
promise的封装及链式写法:
const fs = require('fs')
function pro(filePath){
return new Promise(function(resolve,reject) {
fs.readFile(filePath,'utf8',(err,data)=>{
if(err) {
reject(err)
}else{
resolve(data)
}
})
})
}
pro('a.txt').then(res=>{
console.log(res);
return pro('b.txt')
}).then(res=>{
console.log(res);
return pro('c.txt')
}).then(res=>{
console.log(res);
return pro('d.txt')
}).then(res=>{
console.log(res);
}).catch(err =>{
console.log(err);
})
// 一个出错,下面都不执行,直接进入catch
//打印顺序:a.txt --> b.txt --> c.txt -->d.txt
函数调用,return出去的是一个新的promise对象,作为下次执行时的决定promise状态的主角.
码字不易,如果觉得不错的话,点个赞再走呗