📅  最后修改于: 2023-12-03 14:42:40.608000             🧑  作者: Mango
在Javascript中,承诺是一种处理异步任务的一种方式。当需要执行一个耗时任务,例如数据请求、读取文件等,传统的方式是通过回调函数来处理任务完成后的结果。但是随着业务逻辑复杂度的提升,回调函数嵌套的层数也会越来越深,代码的可读性和可维护性都会大大降低。而使用承诺可以解决这些问题,让异步代码更加优雅,简单。
承诺是一个对象,用来表示异步操作的状态。承诺有三种状态:
pending
:异步操作正在进行中,暂未完成。fulfilled
(也称为“resolved”):异步操作已成功完成,已经得到了结果。rejected
:异步操作失败了,需要处理失败情况。承诺的工作流程大体如下:
resolve()
或reject()
方法,改变承诺状态。.then()
方法)被执行。可以使用Promise
构造函数来创建一个承诺对象,构造函数接受一个函数参数,该函数在异步任务执行成功后调用,并传递异步任务的结果作为参数。
const promise = new Promise((resolve, reject) => {
// 异步任务
const result = true;
if (result) {
// 异步任务成功,调用resolve方法
resolve('成功的结果');
} else {
// 异步任务失败,调用reject方法
reject('失败的原因');
}
});
无论是异步任务成功还是失败,我们都可以通过.then()
方法来处理执行结果。该方法接受两个参数:成功回调和失败回调。如果异步任务成功,.then()
方法会执行成功回调,并将异步任务的结果作为参数传递给该函数;如果异步任务失败,.then()
方法会执行失败回调,并将失败原因作为参数传递给该函数。
promise
.then(result => {
console.log(result); // 输出:成功的结果
})
.catch(reason => {
console.log(reason); // 输出:失败的原因
});
如果有多个异步任务需要执行,并且它们之间没有依赖关系(即可以并行执行),我们可以使用Promise.all()
方法。
const promise1 = new Promise(resolve => setTimeout(resolve, 1000, 'one'));
const promise2 = new Promise(resolve => setTimeout(resolve, 2000, 'two'));
const promise3 = new Promise(resolve => setTimeout(resolve, 3000, 'three'));
Promise.all([promise1, promise2, promise3]).then(values => {
console.log(values); // 输出:["one", "two", "three"]
});
如果有多个异步任务需要执行,并且它们之间有依赖关系(即需要按顺序执行),我们可以使用.then()
方法来链式调用多个异步任务。
const promise1 = new Promise(resolve => setTimeout(resolve, 1000, 'one'));
const promise2 = new Promise(resolve => setTimeout(resolve, 2000, 'two'));
const promise3 = new Promise(resolve => setTimeout(resolve, 3000, 'three'));
promise1
.then(value => {
console.log(value); // 输出:"one"
return promise2;
})
.then(value => {
console.log(value); // 输出:"two"
return promise3;
})
.then(value => {
console.log(value); // 输出:"three"
});
承诺是Javascript中一种处理异步任务的方式。它可以通过改变状态来表示异步任务的执行情况,并可以使用.then()
方法来处理执行结果。承诺可以解决异步任务嵌套的问题,使异步代码更加优雅,简单。