📜  JavaScript |承诺(1)

📅  最后修改于: 2023-12-03 14:42:29.017000             🧑  作者: Mango

JavaScript Promise

在 JavaScript 中,Promise 是一种异步编程的方式,它可以让我们更加优雅地解决回调地狱的问题,处理异步操作的结果。

基本语法

一个 Promise 有三种状态:pending (等待态)、fulfilled (成功态)、和 rejected (失败态)。它有一个 then 方法,可以在 Promise 进入成功态时获取其值,或在失败态时获取其失败原因。

以下是一个简单的 Promise 示例:

const promise = new Promise((resolve, reject) => {
  // some async operation
  const result = doSomething();
  if (result) {
    resolve(result);
  } else {
    reject(new Error('Something went wrong'));
  }
});

promise
  .then(result => console.log(result))
  .catch(error => console.error(error));

这个 Promise 在执行后会返回一个结果,通过调用 then 方法,在成功时获取该结果,也可以通过调用 catch 方法,在失败时获取失败原因。

Promise 的链式调用

Promise 还可以通过链式调用 then 方法来进行多个异步操作。每次调用 then 方法时,都会返回一个新的 Promise ,它可以在下一个 then 方法调用时获得上一个 Promise 返回的值。

以下是一个 Promise 的链式调用示例:

doSomethingAsync()
  .then(result1 => {
    return doSomethingElseAsync(result1);
  })
  .then(result2 => {
    return doThirdThingAsync(result2);
  })
  .then(result3 => {
    console.log(`Got the final result: ${result3}`);
  })
  .catch(error => {
    console.error('Something went wrong:', error);
  });

在这个示例中,我们先调用 doSomethingAsync() 方法,然后将该 Promise 返回的结果传递给 doSomethingElseAsync() 方法,再将第二个返回值传递给 doThirdThingAsync() 方法,最后输出最终的结果。如果任何一些方法返回 Promise 失败,都会被 catch 方法捕获。

Promise.all

有时,我们需要并行地执行多个异步操作,并在所有操作都完成后得到它们的结果。Promise.all 方法可以帮助我们实现这个目标。

以下是 Promise.all 的示例:

const promise1 = Promise.resolve('Hello');
const promise2 = 10;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 2000, 'Goodbye');
});

Promise.all([promise1, promise2, promise3])
  .then(values => {
    console.log(values);
  });

在这个示例中,我们使用了三个 Promise,其中两个是已解决 Promise,另一个是一个等待两秒钟的 Promise。我们使用 Promise.all 方法将它们组合,并在所有异步操作完成时打印结果。

Promise.race

有时,我们需要从多个异步操作中获取最先完成的结果。Promise.race 方法可以帮助我们实现这个目标。

以下是 Promise.race 的示例:

const promise1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, 'one');
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 1000, 'two');
});

Promise.race([promise1, promise2])
  .then(value => {
    console.log(value);
  });

在这个示例中,我们有两个 Promise,分别等待 500 毫秒和 1000 毫秒。我们使用 Promise.race 方法来确定哪个 Promise 首先得到解决,并输出结果。

小结

Promise 是一种异步编程的方式,在 JavaScript 中广泛使用。学习使用 Promise 可以让我们更加轻松地进行异步操作,处理异步操作的结果。在实际开发中应尽量使用 Promise 来避免出现回调地狱的情况。