当前位置: 首页 > article >正文

处理被拒绝的promise

处理被拒绝的promise

至少到目前为止,我们所有的promise都能正常获取到值,现在就来看一下如果处理被拒绝的promise;

  • 客户端网络异常

当我们客户端网络异常的时候,去请求服务端的话,是没有任何的错误提示的;

  1. 第一种方法就是使用按钮的方式
btn.addEventListener('click', function () {
  getCountryData('Russia');
});

当我们客户端离线的时候,我们就能收到一个promise获取失败的错误信息;

在这里插入图片描述

  1. 通过fetch捕获错误

我们可以通过then来捕获错误,让客户端突然离线的话通过alter的方式进行提示

fetch(`https://restcountries.com/v2/name/${country}`)
    .then(
      response => response.json(),
      err => alert(err)
    )

在这里插入图片描述

  1. 通过catch进行捕获

那么如果现在第一个请求成功了,在请求邻国信息的时候突然网络中断了,再邻国的地方添加捕获错误信息不太合适了,这时候可以通过catch的方法来对整个调用链条进行进行捕获;

const getCountryData = function (country) {
  fetch(`https://restcountries.com/v2/name/${country}`)
    .then(response => response.json())
    .then(data => {
      renderCountry(data[0]);
      const neighbour = data[0].borders[0];
      if (!neighbour) return;
      return fetch(`https://restcountries.com/v2/alpha/${neighbour}`);
    })
    .then(response => response.json())
    .then(data => renderCountry(data, 'neighbour'))
    .catch(err => alert(err));
};

在这里插入图片描述

  • 但是在实际生活的网站中,这种弹窗肯定是不合适的,我们不仅需要在控制台中打印错误供排查人员使用,也需要提供一些错误信息给用户进行尝试;先写一个错误信息的函数功能;
const renderError = function (msg) {
  countriesContainer.insertAdjacentText('beforeend', msg);
  countriesContainer.style.opacity = 1;
};

然后再catch进行调用

const getCountryData = function (country) {
  fetch(`https://restcountries.com/v2/name/${country}`)
    .then(response => response.json())
    .then(data => {
      renderCountry(data[0]);
      const neighbour = data[0].borders[0];
      if (!neighbour) return;
      return fetch(`https://restcountries.com/v2/alpha/${neighbour}`);
    })
    .then(response => response.json())
    .then(data => renderCountry(data, 'neighbour'))
    .catch(err => {
      console.error(`${err} ⚠⚠⚠ `);
      renderError(`出现了一些意外!⚠⚠ ${err.message}. 请再次尝试!`);
    });
};

在这里插入图片描述

  • 这里再介绍一下finally方法,这个方法无论在promise正确或者错误的情况都会被调用,所以前面对于透明度的设置可以删除,可以添加到finally方法中,因为不管是错误还是正确,透明度总会被设置为1
const getCountryData = function (country) {
  fetch(`https://restcountries.com/v2/name/${country}`)
    .then(response => response.json())
    .then(data => {
      renderCountry(data[0]);
      const neighbour = data[0].borders[0];
      if (!neighbour) return;
      return fetch(`https://restcountries.com/v2/alpha/${neighbour}`);
    })
    .then(response => response.json())
    .then(data => renderCountry(data, 'neighbour'))
    .catch(err => {
      console.error(`${err} ⚠⚠⚠ `);
      renderError(`出现了一些意外!⚠⚠ ${err.message}. 请再次尝试!`);
    })
    .finally(() => {
      countriesContainer.style.opacity = 1;
    });
};

在这里插入图片描述

  • 现在我们在模拟一个错误场景,假设我们输入的国家名称不存在
getCountryData('123123123');

在这里插入图片描述

它报错的错误好像并不是我们需要去解决的错误,应该就是输入的国家不存在;那我们如果手动的抛出一些我们预想到的错误呢?下篇在一起学习吧!


http://www.kler.cn/a/453224.html

相关文章:

  • Cascader 级联选择器一级单选二级多选
  • 基于SpringBoot的4S店汽车销售管理系统的设计与实现
  • Blender真实灰尘粒子动画资产预设 Dust Particles Pro V1.2
  • Excel粘贴复制不完整的原因以及解决方法
  • Ubuntu20.04 交叉编译Qt5.15.15 for rk3588
  • 操作系统课程设计
  • HTTP 协议规定的协议头和请求头
  • near-synonym反义词生成(2):Prompt +Bert-MLM(FT)
  • Kafka、RocketMQ、RabbitMQ 对比
  • 网站服务器被攻击了怎么办?
  • linux c++ ffmpeg推流
  • HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?
  • 大模型应用技术系列(四): 为RAG应用设计的缓存RAGCache
  • 【嵌入式C语言】指针数组结构体
  • Spring Boot项目开发常见问题及解决方案(下)
  • 《战神:诸神黄昏》游戏运行时提示mss32.dll丢失怎么办?
  • 【LeetCode】LCR 175.计算二叉树的深度
  • Halcon例程代码解读:安全环检测(附源码|图像下载链接)
  • windows nmake 安装openssl
  • Java 中压缩图片并应用 EXIF 旋转信息
  • .NET能做什么?全面解析.NET的应用领域
  • MPLS小实验:利用LDP动态建立LSP
  • c# 线程 AutoResetEvent 的Set()函数多次调用
  • JavaWeb 开发基础入门
  • VIVO C++开发面试题及参考答案
  • 穷举vs暴搜vs深搜vs回溯vs剪枝系列一>电话号码的字母组合