何为promise
发布时间 2023-06-08 11:04:30作者: GTK
请问何为promise ?
先解决一个问题何为 同步 异步
- 同步是什么
- 同步就是内存中顺序执行的处理器指令
- 大白话就是每条指令都会严格按照他们出现的顺序来执行
// 举例
let x = 3; // 第一个执行
x += 4; // 第二个执行
console.log(x); // 第三个执行 这就是顺序
- 异步是什么
- 类似于系统的中断
- 大白话就是这个代码正常执行,而下面的代码正常执行无需等待这个异步代码的执行
console.log(1);
setTimeout(()=>console.log(2),1000); // 这就是一个异步代码
console.log(3);
// 输出 1 3 大约等待1s 再输出2
- 以往的编程模式(已经抛弃,但可学习)
- 这个模式太复杂了
- 在settimeout中使用try/catch来控制成功和失败
function double(value,success,failure) {
setTimeout(()=>{
try {
if(typeof value !== "number") throw "must provide number as first argument"
success(value * 2)
} catch (error) {
failure(error);
}
},1000);
}
const callback = (value) => console.log(value);
const failure = (e) => console.log(e);
double(3,callback,failure); // 输出 6
double('3',callback,failure); // 输出 must provide number as first argument
- 嵌套异步调用(个人感觉这个才是魔鬼)这个也是回调地狱的由来
function double(value,success,failure) {
setTimeout(()=>{
try {
if(typeof value !== "number") throw "must provide number as first argument"
success(value * 2)
} catch (error) {
failure(error);
}
},1000);
}
const callback = (value) => {
double(value,(number)=>console.log(number));
};
const failure = (e) => console.log(e);
// 输出结果
// must provide number as first argument
// 12
// 请思考为什么 must provide number as first argument 比 12 先出现 ?
promise 此时应声而出 它是一种异步编程机制
- promise是es6中的知识点
- 首先它是es6中新增的引用类型Promise,可以使用new进行实例化
- 创建的时候需要传入函数作为参数
- promise的状态有三种
- pending 待定 是最初的状态,但也可以修改其开始状态
- fuldiled 兑现 也称 解决 resolve
- rejected 拒绝
- 可以由pending状态转换为兑现 或 拒绝状态,一旦转换状态,其状态不可逆
- promise的两大主要作用
- 抽象的表示一个异步操作
- 状态转换为兑现 即有一个valu 值
- 状态转换为拒绝 即有一个reason 值
- 执行函数控制promise状态
- resolve() =>兑现
- reject() =>拒绝
- Promise.resolve() 会返回一个promise对象,可以接收多个参数,但是只会返回第一个参数
- Promise.resolve() 等同于 new Promise((resolve,reject)=>resolve())
- 与第四点同理Promise.reject(),特殊的是这个不会被try/catch捕获到
- promise的实例方法
- then()
- then里面有两个函数,第一个是用来执行resolve传入的value,第二个是用来执行reject传入的reason
- then返回的新promise和原先的promise进行比较是false
p.then((value)=>{},(reason)=>{});
- catch相当于是reject的语法糖 只接收一个参数
- finally是为了减少then中的onResolve方法和onReject方法出现冗余代码,主要是用来清理代码
- promise的传递问题暂时不理解
- promise.race() 任意一个完成即执行
- promise.add() 全部完成即执行
- 搭配 async / await使用