这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战
这里先不讨论promise的问题,先讨论一些promise之前的一些问题。
问题
1. 实现执行doSth方法几次之后,去执行回调函数cb
// 高阶函数:函数的参数中有函数(一个函数接收一个函数参数),或者是像闭包一样返回一个函数
/**
* @description 执行doSth方法几次之后,去执行cb
* @param {*} t 次数
* @param {*} cb 回调
*/
function doSth(t, cb) {
return function () {
if (--t === 0) {
cb()
}
}
}
function logSth() {
console.log('我终于找到女朋友了!呀呼~~~');
}
let fn = doSth(4, logSth)
// fn调用4次之后才会执行
fn()
fn()
fn()
fn()
2. 模拟回调函数出现的现象
回调地狱:不好维护,函数里面是可以无限往下走的。比如之前使用$.ajax()方法请求数据的时候,需要等返回结果,然后把返回结果传入下一个ajax方法中,一层套一层的执行不同的任务。
3. 异步
对于异步方法,谁先回结果谁后回结果是不知道的。在处理异步请求的过程中,往往是需要它是同步的 。 上一个请求有结果之后,才能去进行当前需要做的事情。
如:任务A、B,任务B需要任务A的结果去进行下一步的事情,这是一个同步的问题 回调地狱:在异步编程的基础上,要做到一个同步的结果
Promise
Promise 对象用于表示一个异步操作的最终完成 (或失败)及其结果值。
Promise的状态
每一个Promise对象都有以下三种状态:
- PENDING : 进行中,
Promise对象的初始状态 - FULFILLED : 已成功
- REJECTED : 已失败
每一个
Promise对象只能由PENDING状态变成FULFILLED或REJECTED,且状态发生变化以后就能再改变了 ---- 记住这个特性
resolve reject pending
pending -> resolved
pending -> rejected
反过来是不行
resolved <-> rejected
promise了解
promise从英文来说是承诺的意思,所以就可能有以下几种情况:
promise是解决异步流程化的一种手段(异步:互不相干,互不影响; 流程化:用异步这种方法的时候,需要一个先后顺序)
需要注意的特点: Promise是一个构造函数,需要通过new 创建。 Promise有且只有一个参数叫做executor(执行器),executor有两个参数,resolve和reject,并且都是函数。executor执行器在new Promise时执行调用,executor是同步执行的。