Promise
是 ES6 中新增的一种异步编程解决方案。它可以将异步操作写成同步操作的形式,提供了更加便捷的读写方式,并且解决了传统回调函数带来的回调地狱问题。
一个 Promise
对象代表着某个异步操作的最终结果。一个 Promise
对象有三种状态:pending
(进行中)、fulfilled
(已成功) 和 rejected
(已失败)。当 Promise
的 pending
状态变为 fulfilled
(已成功),则会调用 then
方法;当 pending
状态变为 rejected
(已失败),则会调用 catch
方法。then
和 catch
方法都是返回新的 Promise
对象,因此可以链式调用。
一个最基本的 Promise
在创建后可以执行异步任务,并通过 resolve
或 reject
方法告诉外界异步任务处理的结果,例如:
function asyncOperation() {
const p = new Promise((resolve, reject) => {
setTimeout(() => {
const randomNumber = Math.random();
if (randomNumber >= 0.5) {
resolve(randomNumber); // 将异步结果传递给 then
} else {
reject('Error: Operation Failed!'); // 将错误信息传递给 catch
}
}, 1000);
});
return p;
}
function asyncOperationCaller() {
asyncOperation()
.then(result => {
console.log('Operation succeed:', result);
})
.catch(error => {
console.error('Operation failed:', error);
});
}
asyncOperationCaller();
在上面的代码中,我们定义了一个异步操作 asyncOperation()
,并在其中创建了一个 Promise
对象。当异步操作成功后,我们调用了 resolve()
方法把异步任务处理的结果传递给了 then
方法,否则我们调用了 reject()
方法并传递错误信息给了 catch
方法。
最后,我们通过 asyncOperationCaller()
间接地调用 asyncOperation()
函数,并在 then
和 catch
方法中处理异步任务执行的结果。如果异步任务成功,则打印“Operation succeed”和异步任务的结果值;否则打印“Operation failed”和对应的错误信息。
可以看到通过 Promise
的方式处理异步任务,将异步任务的结果封装成一个对象,并在异步任务执行完成后将其传递给了 then
方法或 catch
方法进行处理。这种方式的好处是可以通过链式调用来进行优化,避免了传统回调函数的回调地狱。