ES6 - promise 与 async / await【Promise 封装丐版 Ajax】

什么是promise?(前言)

这只是一个promise精简版,并没有涵盖所有promise知识点 🚀

Promise其实就是一个对象,用来传递异步操作的消息,可以用来解决 回调地狱’的问题

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

Promise

常见回调地狱

这是回调地狱 🤔

ajax('http://www.test.com', 'get', () => {
  ajax('http://www.test.com', 'get', () => {
    ajax('http://www.test.com', 'get', () => {
      ajax('http://www.test.com', 'get', () => {
        ajax('http://www.test.com', 'get', () => {
          ajax('http://www.test.com', 'get', () => {});
        });
      });
    });
  });
});

这回调地狱真的是不好看啊 🤨


Pormise状态

  • pending:初始状态
  • fulfilled:操作成功-完成
  • rejected:操作失败

如果异步操作成功的话,resolve方法将Promise对象的状态从未完成变为成功(pending => fulfilled

如果异步操作失败,reject方法将Promise对象的状态从未完成变为失败(pending => rejected

如果执行resolve方法,对应的会调用 then 方法,then方法传入一个函数作为参数,该函数的参数的值就是 resolve 方法的实参

如果执行 reject 方法,对应的会调用 catch 方法,catch方法传入一个函数作为参数,该函数的参数的值就是 reject 方法的实参


// const httpCode = 201;
const httpCode = 404;

const testPromise = new Promise((resolve, reject) => {
  // 使用异步 setTimeout模拟请求
  setTimeout(() => {
    if (httpCode === 201)
      return resolve('请求成功'); // 请求成功调用 resolve 函数
    else reject('请求失败'); // 请求失败
  }, 500);
});

testPromise
  .then(result => console.log(result)) // 请求成功 -- resolve
  .catch(err => console.log(err)); // 请求失败 -- reject

// 请求失败

使用 Promise 封装一个最简易的Ajax(丐版Ajax)

// 封装Ajax
const request = function (method, url, data) {
  const xhr = new XMLHttpRequest();
  return new Promise((resolve, reject) => {
    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4) {
        // 服务器链接已经建立
        if (xhr.status === 200) {
          // 链接成功
          resolve(xhr.responseText);
        } else {
          reject(xhr.status);
        }
      }
    };
    xhr.open(method, url);
    xhr.send(data);
  });
};

//----------------------------//
request('get', 'http://127.0.0.1:5500/test.json')
  .then(result => console.log(result))
  .catch(err => console.log(err));

请添加图片描述


async \ await 玩转同步异步

上面我们尽管使用了Promise 解决了回调地狱的问题,但是并不是完美无缺的,如果接口是链式关联的,那么 Promisethen 方法里其实也是一个小型回调,维护起来不是特别的方便,这时就需要我们的ES6的 async 以及 await 了,不过准确来说这俩个是 ES8的

async 表示异步,await表示等待,所以 async 声明一个异步函数,await则用于等待一个异步函数或者方法的执行完毕

const stateCode = 201;

function getReq() {
  return new Promise((resolve, reject) => {
    // 模拟 ajax 请求
    setTimeout(() => {
      resolve({
        state: stateCode,
        mothod: 'GET',
        data: { name: 'Brave-AirPig', age: 22 },
      });
    }, 500);
  });
}

// 定义一个异步函数

async function getAsync() {
  const message = await getReq();
  console.log(message);
}

getAsync();

请添加图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Ajax是一种用于在Web应用程序中发送异步请求的技术。Promise是一种处理异步操作的对象,它可以表示一个异步操作的最终完成或失败,并返回一个值。Async/await是一种基于Promise的异步编程解决方案。 在给定的引用中,我们可以看到使用了async和await关键字来处理异步请求。在方法二中,使用async关键字声明一个异步函数,并使用await关键字等待异步操作完成。在方法三中,也使用了async关键字来定义一个异步函数,通过await等待异步请求的完成。 总的来说,ajax promise async/await是一种用于处理异步操作的解决方案,通过使用Promiseasync/await关键字可以更方便地处理异步请求并获取返回结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [深入掌握Ajax + Promise + Async + await 异步解决方案](https://blog.csdn.net/qq_47969241/article/details/120525361)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [ES6 - promiseasync / awaitPromise 封装丐版 Ajax】](https://blog.csdn.net/weixin_63836026/article/details/126301083)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Try Tomato

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值