返回

彻底搞懂 Promise:通过这 5 道难题检验你的理解

前端

引言:

Promise 是 JavaScript 中处理异步操作的强大工具。它提供了一种机制,使我们能够在操作完成时执行回调函数。通过解决以下这 5 道难题,你可以彻底检验你对 Promise 的理解。

难题 1:解析自身

const promise = Promise.resolve(promise);

当我们解析一个 Promise 对象本身时,会发生什么?

难题 2:解析或拒绝一个 Promise

const promise1 = Promise.resolve('成功');
const promise2 = Promise.reject(new Error('失败'));

promise1 和 promise2 分别解析和拒绝。解释它们的后续行为。

难题 3:then 的链式调用

const promise = Promise.resolve('成功');

promise
  .then((result) => {
    console.log(result); // 打印 '成功'
  })
  .then(() => {
    console.log('链式调用成功');
  });

解释 then 的链式调用的工作原理。

难题 4:多个 Promise 的执行顺序

const promise1 = Promise.resolve('Promise 1');
const promise2 = Promise.resolve('Promise 2');

Promise.all([promise1, promise2]).then((results) => {
  console.log(results); // 打印 ['Promise 1', 'Promise 2']
});

当使用 Promise.all 时,多个 Promise 的执行顺序如何?

难题 5:处理异常

const promise = Promise.resolve('成功');

promise
  .then(() => {
    throw new Error('异常');
  })
  .catch((error) => {
    console.log(error.message); // 打印 '异常'
  });

解释 Promise 如何处理异常。

答案:

难题 1:

解析自身会导致无限循环,因为 Promise 会不断解析自身。

难题 2:

promise1 解析后,链中后续的 then 回调函数会被调用。promise2 拒绝后,链中的 catch 回调函数会被调用。

难题 3:

then 方法返回一个新的 Promise,它在当前 Promise 解析后解析。通过链式调用,可以将多个操作串联起来。

难题 4:

使用 Promise.all 时,多个 Promise 会并行执行,但 then 回调函数在所有 Promise 都解析后才被调用。

难题 5:

如果 then 回调函数抛出异常,catch 回调函数会被调用,并传递该异常。

结论:

通过解决这 5 道难题,你已经彻底理解了 Promise 的核心概念。这些知识对于使用 Promise 编写可靠且高效的异步 JavaScript 代码至关重要。