Promise是异步编程的一种解决方案,用来解决多层回调嵌套的问题。它的构造函数是同步执行的,then 方法是异步执行的,所以创建后里面的函数会立即执行,构造函数中的resolve和reject只有第一次执行有效,也就是说Promise状态一旦改变就不能再变。简单说
Promises是一个容器或对未来事情的承诺。
const p = new Promise((resolve, reject) => {
resolve(22);
})
console.log(p); //22
【回调地狱:代码臃肿、可读性差、耦合度高、只能在回调里处理异常】
状态
有三种状态:pending
(进行中)、fullfilled
(已完成)、rejected
(已失败)。只有异步操作的结果可以决定当前是哪一种状态,任何其他操作都不能改变这个状态。未调用resolve和reject前它处于pending
状态,调用resolve
后处于fullfilled
状态,调用reject
后处于rejected
状态。只能有pending
->fullfilled
或pending
->rejected这两种过程。
当确定为fullfilled
或rejected
后就会处于敲定(settled)状态不会再变
。
实例方法
1.Promise.then();//注册回调函数,可链式调用,返回值是一个Promise对象
2.Promise.catch();//处于rejected状态或者抛出异常或者错误时执行
3.Promise.finally();//无参数的,无论Promise对象变成fulfilled或reject状态,最终都会执行
类方法
1.Promise.resolve();//相当于new Promise,并且执行resolve操作
2.Promise.reject();//相当于new Promise,并且执行reject操作
3.Promise.race();//多个任务同时执行,返回最先执行结束的结果,无论成功或失败
4.Promise.any();//返回任意一个最快执行 resolve 回调的 Promise 对象
5.Promise.allSettled();//当多个任务都结束(完成或失败)时,返回一个包含每个 Promise 解决状态的对象数组,每个对象表示对应的promise结果,都含有status和value属性
6.Promise.all();//多任务同时执行,若成功则以数组方式返回,若有一个reject则返回reject结果
Promise.all([promise1, promise2, promise3]).then(()=>{})
async/await
使得异步代码看起来像同步代码。async 函数的返回值为 Promise 对象,await 必须写在 async 函数中, 但 async 函数中可以没有 await,如果 await 的 Promise 失败了, 就会抛出异常, 需要通过 try...catch 捕获处理。generator与async/await类似。
function fn2() {
return new Promise((resolve, reject) => {
setTimeout(() => {
// resolve(1000)
reject(1000)
}, 1000);
})
}
async function fn3() {
try {
const value = await fn2()
} catch (error) {
console.log('得到失败的结果', error)
}
}
fn3() // 得到失败的结果 1000
参考
promise和async await区别 - 简书
Promise精选面试题 - 简书
Promise(详细讲解,后续会进行更新... ...)_promise.all(paths.map-CSDN博客