Promise如何使用?

Promise 是 JavaScript 中用于处理异步操作的对象,它代表了一个异步操作的最终完成(或失败)及其结果值。在前端开发中,Promise 常用于处理如 AJAX 请求、定时器、文件读取等异步操作。

Promise 的基本用法如下:

  1. 创建 Promise

使用 new Promise() 构造函数创建一个新的 Promise 对象。构造函数接受一个函数作为参数,这个函数有两个参数:resolvereject,它们是两个函数,由 JavaScript 引擎提供,不需要自己部署。

const promise = new Promise((resolve, reject) => {
  // 模拟异步操作
  setTimeout(() => {
    if (/* 异步操作成功 */) {
      resolve('成功的结果');
    } else {
      reject('失败的原因');
    }
  }, 1000);
});
  1. 处理 Promise

Promise 实例生成以后,可以使用 .then().catch() 方法分别指定 resolved 状态和 rejected 状态的回调函数。第一个回调函数是 Promise 对象的状态变为 resolved 时调用,第二个回调函数是 Promise 对象的状态变为 rejected 时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受 Promise 对象传出的值作为参数。

promise
  .then(result => {
    console.log(result); // 输出 '成功的结果'
  })
  .catch(error => {
    console.log(error); // 输出 '失败的原因'
  });

或者,你也可以使用 async/await 语法糖来更简洁地处理 Promise:

async function handlePromise() {
  try {
    const result = await promise;
    console.log(result); // 输出 '成功的结果'
  } catch (error) {
    console.log(error); // 输出 '失败的原因'
  }
}

handlePromise();
  1. Promise 链

Promise 对象的 .then() 方法返回的是一个新的 Promise 对象,因此可以形成链式调用。这意味着你可以将多个异步操作串联起来,依次执行。

const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => resolve(1), 1000);
});

promise1
  .then(result => {
    console.log(result); // 输出 1
    return result + 1; // 返回一个新的 Promise 对象,值为 2
  })
  .then(result => {
    console.log(result); // 输出 2
    return result + 1; // 返回一个新的 Promise 对象,值为 3
  })
  .then(result => {
    console.log(result); // 输出 3
  });
  1. Promise.all()

Promise.all() 方法用于将多个 Promise 实例包装成一个新的 Promise 实例,这个新的 Promise 实例在所有的子 Promise 实例都完成(resolved)或其中一个失败(rejected)时才会触发。这个方法常用于并行处理多个异步操作,并在所有操作完成后进行统一处理。

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

Promise.all([promise1, promise2, promise3])
  .then(results => {
    console.log(results); // 输出 [1, 2, 3]
  })
  .catch(error => {
    console.log(error); // 如果任何一个 Promise 失败,则输出失败的原因
  });

来源链接:https://www.cnblogs.com/ai888/p/18665628

请登录后发表评论

    没有回复内容