📜  javascript中的承诺(1)

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

Javascript中的承诺

在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()方法来处理执行结果。承诺可以解决异步任务嵌套的问题,使异步代码更加优雅,简单。