谈谈promise
当别人问你关于promise的问题
- promise常用来来处理异步操作,用来解决回调地狱
- promise带有三种状态,pedding:初始状态,resolved:成功状态图,rejected:失败状态
- promise可以链式编程
Promise 代表Promise构造函数,对外提供统一的 API,自己身上有all、reject、resolve等方法,原型上有then、catch等方法。我们在函数中存放一个异步操作,返回实例化对象接受对象的值
使用Promise生成实例对象,promise对象会继承构造函数的原型;就是说它只有.then .catch方法
构造函数的all方法
let p1=Promise.resolve('success1')
let p2=Promise.resolve('success2')
let p3=Promise.resolve('success3')
//Premise.all方法会将所有成功的结果放入一个数组中,如果有一个失败,就返回失败的结果
let result = Promise.all([p1,p2,p3])
console.log(result); // [success1,success2,success3]
构造函数的race方法
let p1 = new Promise((resolve,reject) => {
setTimeout(() => {
resolve('success1')
}, 1000)
})
let p2 = Promise.reject('success2')
p2.catch(err=>{console.log(err);})
let p3 = Promise.resolve('success3')
//Promise.race()方法会返回最早改变状态的promise结果,谁执行快,返回谁,不管成功还是失败
let result = Promise.race([p1, p2, p3])
console.log(result); //success2
普通封装
let p=new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('123')
},3000)
})
p.then(res=>{
console.log(res);
}).catch(err=>{
console.log(err);
})
promise封装fs请求文件函数
function getFile (path) {
return new Promise((resolve, reject) => {
require('fs').readFile(path, (err, data) => {
if (err) {
reject(err)
return
}
resolve(data.toString())
})
})
}
promise封装ajax
function fetch(method, url, data){
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
var method = method || "GET";
var data = data || null;
xhr.open(method, url, true);
xhr.onreadystatechange = function() {
if(xhr.status === 200 && xhr.readyState === 4){
resolve(xhr.responseText);
} else {
reject(xhr.responseText);
}
}
xhr.send(data);
})
}
// 使用
fetch("GET", "/some/url.json", null)
.then(result => {
console.log(result);
})