一、promise:用于处理异步操作的对象(实际是一个构造函数)
promise接受一个函数作为参数,分别是resolve和reject;
resolve处理成功的回调,通过.then输出成功的结果;
reject处理失败的回调,通过.catch输出失败的结果;
function fetchData() {
return new Promise((resolve, reject) => {
// 异步操作
if (/* 操作成功 */) {
resolve(result); // 操作成功后调用resolve方法
} else {
reject(error); // 操作失败后调用reject方法
}
});
}
fetchData()
.then(result => {
// 处理操作成功的结果
})
.catch(error => {
// 处理操作失败的结果
});
二、async/await:异步编程基于Promise的语法糖
async定义一个异步函数,await等待一个promise对象返回解析结果
通过try()处理成功的结果,catch()处理失败的结果
async function fetchData() {
try {
const result = await asyncOperation(); // 等待异步操作完成并获得结果
// 处理操作成功的结果
} catch (error) {
// 处理操作失败的结果
}
}
fetchData();
三、回调地狱的说明和解决方法
1、回调地狱:当有多个异步操作需要按特定的顺序执行,而每一个操作都依赖于前一个操作的结果时,可能会产生回调地狱
回调地狱的例子:
asyncFunction1(function(result1) {
asyncFunction2(result1, function(result2) {
asyncFunction3(result2, function(result3) {
// 更多嵌套...
});
});
});
解决回调地狱:
方法1:使用Promise
asyncFunction1()
.then(result1 => asyncFunction2(result1))
.then(result2 => asyncFunction3(result2))
.then(result3 => {
// 处理最终结果
})
.catch(error => {
// 处理错误
});
方法2:使用async/await
async function doAsyncOperations() {
try {
const result1 = await asyncFunction1();
const result2 = await asyncFunction2(result1);
const result3 = await asyncFunction3(result2);
// 处理最终结果
} catch (error) {
// 处理错误
}
}
doAsyncOperations();
四、Promise常用静态方法(用来处理异步操作结果)
1、
Promise.resolve(value):返回一个解析过的 Promise 对象,以给定的值解析。如果该值是一个 Promise,它将被原样返回
let resolvedPromise = Promise.resolve(42);
resolvedPromise.then(value => console.log(value)); // 输出 42
2、
Promise.reject(reason):返回一个拒绝的 Promise 对象,以给定的原因(reason)拒绝
let rejectedPromise = Promise.reject("Error!");
rejectedPromise.catch(reason => console.log(reason)); // 输出 "Error!"
3、Promise.all(iterable):返回一个 Promise,该 Promise 在可迭代对象中的所有 Promise 都已被解析或被拒绝后,以解析的形式被解决
let promise1 = Promise.resolve(1);
let promise2 = Promise.resolve(2);
let promise3 = Promise.resolve(3);
Promise.all([promise1, promise2, promise3])
.then(values => console.log(values)) // 输出 [1, 2, 3]
.catch(error => console.log(error));
4、Promise.race(iterable): 接收一个可迭代的对象,例如数组,包含一组 Promise 对象。返回一个新的 Promise 对象,该对象在迭代器中的第一个 Promise 解析或拒绝时解析或拒绝
let promise1 = new Promise(resolve => setTimeout(() => resolve(1), 1000));
let promise2 = new Promise(resolve => setTimeout(() => resolve(2), 500));
Promise.race([promise1, promise2])
.then(winner => console.log(winner)) // 输出 2
.catch(error => console.log(error));
5、Promise.any(iterable): 接收一个可迭代对象,返回一个新的 Promise 对象。该 Promise 对象在可迭代对象中的任何 Promise 对象成功解析时就会被解析。如果所有 Promise 对象都被拒绝,则返回一个包含所有拒绝原因的数组
let promise1 = new Promise((resolve, reject) => setTimeout(() => reject("Error 1"), 1000));
let promise2 = new Promise(resolve => setTimeout(() => resolve("Success!"), 500));
Promise.any([promise1, promise2])
.then(result => console.log(result)) // 输出 "Success!"
.catch(errors => console.log(errors)); // 未被调用
6、Promise.allSettled(iterable): 与 Promise.all
类似,但不关心 Promise 对象是否成功解析。它等待所有的 Promise 对象都被解析(无论是解析还是拒绝),然后返回一个包含所有结果的数组
let promise1 = Promise.resolve(1);
let promise2 = Promise.reject("Error");
let promise3 = Promise.resolve(3);
Promise.allSettled([promise1, promise2, promise3])
.then(results => console.log(results))
.catch(error => console.log(error));