众所周知,promise是一个用来解决异步编程的一个方案,翻了几篇文章谈谈自己的理解。
promise对象有三种状态分别是pending、resolved(成功)、rejected(失败),新创建的promise对象状态是pending,promise对象有一个函数参数用来作为回调函数,回调函数中执行异步的操作,当异步执行成功时promise对象状态就会从pending转变为resolved,失败则会变成rejected状态,并且他们之间只能进行一次转换,转换的关系只有以下两种,pending=>rejected,pending=>resolved;成功后便会调用then()函数,失败则调用catch()函数,这两个函数都会返回一个新的promise对象。
语法
//1.新建一个promise对象
const p = new Promise( (resolve, reject) => {
//执行异步的操作
//如果成功调用resolve(value)
//失败rejecte(reason)
setTimeout(
resolve('hello');
);
});
p.then(
//接收成功的value数据
value => {
console.log(value);
}
);promise相比传统的回调函数特点是指定回调函数的方式更加灵活,promise启动异步任务之后返回promise对象,再给promise对象绑定回调函数,甚至可以在异步执行完成之后在指定回调函数。第二点就是支持链式调用,可以解决回调地狱问题。
举个例子
let fs = require('fs')
fs.readFile('./a.txt','utf8',function(err,data){
fs.readFile(data,'utf8',function(err,data){
fs.readFile(data,'utf8',function(err,data){
console.log(data)
})
})
})let fs = require('fs')
function read(url){
return new Promise((resolve,reject)=>{
fs.readFile(url,'utf8',function(error,data){
error && reject(error)
resolve(data)
})
})
}
read('./a.txt').then(data=>{
return read(data)
}).then(data=>{
return read(data)
}).then(data=>{
console.log(data)
}).catch(failureCallback);以上就是普通回调函数和使用promise对象来解决异步的区别,不难看出无论是在阅读性还是在异常处理上都比较简单方便。这就完了吗,然而这并不是最简单的方法,async和await的配合使用且听下回分解
参考
链接:https://juejin.cn/post/6844903629187448845