JavaScript深入理解-Promise以及常用方法详解

本文详细介绍了Promise的原理与用法,包括Promise的状态、创建方式、静态方法如Promise.all、Promise.allSettled、Promise.any、Promise.race,以及原型方法如catch、then和finally。通过实例展示了如何在实际项目中使用Promise处理异步操作,包括链式调用和异常捕获。
摘要由CSDN通过智能技术生成

Promise

Promise 介绍

Promise 对象表示一个异步操作的最终完成(或失败)及其结果值。

状态:

一个 promise 必然处于以下几种状态之一

  • 待定:初始状态(pending)
  • 已兑现:操作成功完成(fulfilled)
  • 已拒绝:操作失败(reject)

创建 Promise

Promise 对象是由关键字 new 及其构造函数来创建的。该构造函数会把一个叫做“处理器函数”(executor function)的函数作为它的参数。这个“处理器函数”接受两个函数——resolve 和 reject ——作为其参数。当异步任务顺利完成且返回结果值时,会调用 resolve 函数;而当异步任务失败且返回失败原因(通常是一个错误对象)时,会调用 reject 函数。

new Promise((resolve, reject) => {
   
  //处理操作  返回resolve或者reject
  if (flag) resolve(data);
  eles(reject(data));
});

需要某个自定义的函数,变成 Promise 只需返回一个 Promise 即可

function myFun(flag) {
   
  return new Promise((resolve, reject) => {
   
    //处理操作  返回resolve或者reject
    if (flag) resolve(data);
    eles(reject(errorData));
  });
}

在具体项目中,使用 Promise 封装获取当前配置方法。

/**
 * 获取字典列表
 * axios : axios
 * lang : 当前传入语言 ,根据不同语言,获取配置不同
 *
 * 判断sessionStorage里是否获取到当前所需要字典配置。
 * 如果有返回该配置,获取不到再从接口中获取数据,并保存到sessionStorage。
 */
function getDictionary(axios, lang) {
   
  // 查看sessionStorage
  const dic = sessionStorage.getItem("dictionary_data_" + lang) || null;
  // 返回一个Promise对象
  return new Promise((resolve, reject) => {
   
    if (dic) resolve(JSON.parse(dic));
    else {
   
      axios
        .get(`/api/dictionary?language=${
     lang}`)
        .then((res) => {
   
          const dic_data = {
   };
          if (res.data.code === 0 && res.data.result) {
   
            res.data.result.forEach((r) => (dic_data[r.itemName] = r));
            //存放sessionStorage
            sessionStorage.setItem(
              "dictionary_data_" + lang,
              JSON.stringify(dic_data)
            );
            // 返回数据
            resolve(dic_data);
          } else reject();
        })
        .catch((error) => reject());
    }
  });
}

静态方法

Primise.all(iterable)

传参需要是一个可迭代对象
Promise.all 返回一个 Promise 对象。
该 Promise 对象会在 Promise.all 的 iterable 参数对象里的所有 Promise 对象都成功才会触发。

简单来说就是只有 Promise.all 参数里的所有 Promise 成功才会触发,有一个失败就不会触发。

例如:

var promise1 = Promise.resolve("heihei");
var promise2 = "wenbo";
var promise3 = new Promise((resolve, reject) => {
   
  setTimeout(() => {
   
    resolve([1, 2, 3]);
  }, 2000);
});

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

上面代码 会在大约两秒之后 打印输出 [ 'heihei', 'wenbo', [ 1, 2, 3 ] ]
因为 Promise.all 需要等待 promise3 中的 setTimeout 完成后才会触发返回 Promise 对象

又例如:

var pro
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Promise.all 方法JavaScript 中的一个高阶函数,用于将多个 Promise 对象组合成一个新的 Promise 对象。它接收一个 Promise 对象数组作为参数,并返回一个新的 Promise 对象。 当传入的 Promise 对象数组中的所有 Promise 对象都变为 resolved 状态时,返回的 Promise 对象才会变为 resolved 状态。如果数组中任意一个 Promise 对象变为 rejected 状态,则返回的 Promise 对象会立即变为 rejected 状态。 Promise.all 方法的使用方式如下: ```javascript const promises = [promise1, promise2, promise3]; Promise.all(promises) .then((results) => { // 所有 Promise 对象都已经 resolved console.log(results); }) .catch((error) => { // 任意一个 Promise 对象变为 rejected console.error(error); }); ``` 在上述示例中,`promises` 是一个包含多个 Promise 对象的数组。当所有的 Promise 对象都变为 resolved 状态时,`then` 方法中的回调函数会被执行,并且传入一个包含所有 resolved 值的数组 `results`。如果其中任意一个 Promise 对象变为 rejected 状态,则 `catch` 方法中的回调函数会被执行,并且传入第一个变为 rejected 状态的 Promise 对象的错误信息。 需要注意的是,传入 Promise.all 的数组中可以包含不仅仅是 Promise 对象,也可以包含其他类型的值。在这种情况下,这些值会被隐式地转换为 resolved 状态的 Promise 对象。 希望以上解释对你有所帮助!如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值