1-为什么要有promise
2-怎么使用promise
之前处理异步的方式
处理前:这样是拿不到成功或者失败的结果的
//request.js
function request(url){
setTimeout(() => {
if(url === 'coder'){
let name = ['a', 'b', 'c'];
return name;
}else{
let err = 'false';
return err;
}
}, 3000)
}
//main.js
request('coder')
如果我们想要拿到成功或者失败的结果就需要通过回调函数的方式处理
//request.js
function request(url, success, err){
setTimeout(() => {
if(url === 'coder'){
let name = ['a', 'b', 'c'];
return success(name);
}else{
let err = 'false';
return err(err);
}
}, 1000)
}
//main.js
request('coder',(res) => {
console.log(res);
}, (err) => {
console.log(err);
});
这种处理的弊端
通过promise重构
异步请求的代码需要放到executor中
function req(url){
return new Promise((resolve, reject) => {
setTimeout(() => {
if(url === 'coder'){
let suc = [];
resolve(suc)
}else{
let err = 'false';
reject(err)
}
}, 1000)
})
}
const result = req("coder");
result.then((res) => {
console.log(res);
}).catch((res) => {
console.log(res);
})
promise的resolve详解
当resolve中传入一个promise时,它的状态就会由新的的Promise决定
const newP = new Promise((resolve, reject) => {
reject(6666)
})
new Promise((res, rej) => {
res(newP)
}).then((res) => {
console.log(res);
}, (err) => {
console.log(err);
})
reslove中也可以传入一个对象,同样这个对象中的then方法决定了promise的状态
这个传入的对象实现了thenable
new Promise((res, rej) => {
const obj = {
then(res, rej) {
rej(666)
}
}
res(obj)
}).then((res) => {
console.log("resolve:" + res);
}, (err) => {
console.log("reject" + err);
})
then方法详解
对象方法:需要先创建一个对象,然后在调用对象的方法
类方法:不需要创建对象,可以直接通过类来使用类的方法,类方法用static关键字修饰
class promise {
//对象方法
then(){
}
eating(){
}
//类方法
static all(){
}
}
then方法可以有返回值,且这个返回值会是一个新的promise,返回的内容是一个普通值的话,则改返回内容会作为新的promise的resolve值。
这就是promise的链式调用,他的本质就是把then方法中的返回值作为一个新的promise