文章目录
异步编程解决方案
一、三个状态
1.promise内部状态 不受外界影响,由异步编程结果决定
pending进行中
fulfilled成功
rejected失败
2.promise中的状态 一旦发生变化不会再修改
Promise对象的状态改变,只有两种可能:
从pending变为fulfilled 和 从pending变为rejected
二、基本用法
ES6 规定,Promise对象是一个构造函数,用来生成Promise实例
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject,它们是两个函数
resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去
1.举例
let promise=new Promise((resolve,reject)=>{
let status=true;
if(status){
resolve('成功');
}
else{
reject(new Error('失败'));
}
})
//promise对象的使用
//写法一
promise.then((res)=>{
//成功回调函数 resolve
console.log(res);
},(error)=>{
console.log(error);
})
//输出: 成功
//写法二
promise.then((res)=>{
//resolve
console.log(res);
}).catch(()=>{
//reject
console.log(error);
}).finally(()=>{
console.log("最终执行的代码");
});
//输出: 成功 最终执行的代码
- 一个promise使用另一个promise,状态是由被使用的promise决定
let p1=new Promise((resolve,reject)=>{
setTimeout(function () {
resolve("123");
},2000)
});
let p2=new Promise((resolve,reject)=>{
setTimeout(function () {
resolve(p1);
},1000)
});
p2.then((res)=>{
console.log(res); //123 (2s后输出)
})
let p1=new Promise((resolve,reject)=>{
setTimeout(function () {
reject(new Error("失败"));
},2000)
});
let p2=new Promise((resolve,reject)=>{
setTimeout(function () {
resolve(p1);
},1000)
});
p2.then((res)=>{
console.log(res);
}).catch((err)=>{
console.log(err); //Error: 失败 (2s后输出)
})