在之前的面试过程中,经常会被问到如何解决异步地狱回调?Promise的使用方法?又或者是你可以手写Promise吗?今天就结合之前的使用以及在网上对多个技术博客的学习,对自己理解的Promise进行一个总结。
什么是Promise
ES6原生提供了Promise对象,Promise对象代表了未来将要发生的事情,用来传递异步操作的消息。并且Promise提供了统一的API,各种异步操作都可以使用同样的方法进行处理。
但是Promise又存在着一些缺点,包括:1.无法取消。一旦创建就会立即执行,无法中途取消。2.如果不设置回调函数,Promise内部会抛出错误,但是却不会显示在外部。3.处于pending状态的时候,无法知道现在是进展到哪一个阶段。
在Promise出现之前,这种情况都是由回调函数来进行解决的,但是层层嵌套的回调函数又容易导致掉进回调地狱。如下:
const fs = require('fs');
fs.readFile('1.txt',(err,data)=>{
fs.readFile('2.txt',(err,data)=>{
fs.readFile('3.txt',(err,data)=>{
//....
});
});
});
使用Promise对上述代码进行重写后:
const readFile = function(fileName){
return new Promise((resolve,reject)=>{
fs.readFile(fileName,(err,data)=>{
if(err){
reject(err)
}
else{
resolve(data)
}
})
})
}
readFile('1.txt').then(data=>{
return readFile(2.txt);
}).then(data=>{
return readFile(3.txt);
}).then(data=>{
//...
})
Promise规范
es6采用的是Promise/A+规范。es6还引入了Promise.all、Promise,race、Promise,catch、Promise.resolve、Promise.reject等方法。
Promise的基本结构
平时对Promise的使用
var fn = new Promise(function(resolve,reject){
console.log('start');
setTimeout(function(){
resolve(2)
},1000)
})
fn.then(function(res){
console.log('suc',res)
},function(err){
console.log('err',err)
)}