封装 ajax 为Promise异步函数

使用 Promise 封装 $.ajax 请求函数。 集中处理 错误返回。 没有太多细节,直接上代码。

代码:

/**
 * @Description: 封装 基本请求函数
 * @author 蔡昂 (cgh1999520@gmail.com)
 * @date 2019/5/5
 */
function f_request() {
  //  默认配置信息
  let baseConfig = {
    BASE_URL: '',  // 基本URL 地址
    contentType: 'application/json;charset=utf-8'
  };

  /**
   * @Description:  封装内部请求函数
   * @date 2019/5/5
   *
   * @param url: 请求Url 地址,可通过设置 BASE 地址
   * @param data: 请求数据
   * @param method: 请求方式
   */
  function request(url, data, method) {
    return new Promise((resolve, reject) => {
      $.ajax({
        url: baseConfig.BASE_URL + url,
        type: method,
        data: data,
        xhrFields: {  // 携带Cookie 信息
          withCredentials: true
        },
        crossDomain: true, // 使用跨域的XMLHttpRequest
        contentType: baseConfig.contentType,
        dataType: 'json',
        success: res => {
          // 判断当前code 是否是正确,不正确则返回。
          if (!res.state) {
            reject(res);
            return;
          }
          // 如果请求成功,则返回数据结果
          resolve(res.data);
        },
        error: err => {
          alert('服务器请求失败');
          reject(err)
        }
      })
    })
  }

  /**
   * @Description: get请求
   * @date 2019/5/5  9:46
   *
   * @param url: 请求Url 地址,可通过设置 BASE 地址
   * @param data: 请求数据
   * @param config: 配置参数,可以自己定义BaseConfig 扩展。
   */
  function get(url, data = {}, config = {}) {
    // 通过对象合并,覆盖本地的baseConfig 配置
    Object.assign(baseConfig, config);
    return request(url, data, 'GET')
  }

  /**
   * @Description: post 请求
   * @date 2019/5/5  9:46
   *
   * @param url: 请求Url 地址,可通过设置 BASE 地址
   * @param data: 请求数据
   * @param config: 配置参数,可以自己定义BaseConfig 扩展。
   */
  function post(url, data = {}, config = {}) {
    // 通过对象合并,覆盖本地的baseConfig 配置
    Object.assign(baseConfig, config);
    return request(url, data, 'POST')
  }

  // 通过闭包, 只返回 get / post 请求函数
  return {
    get,
    post
  }
}
复制代码

请求代码使用:

// GET 请求
f_request().get('/test/api').then(res => {
  console.error(res, '请求成功')
},err => {
  console.error(err, '请求错误')
});


// POST 请求
f_request().post('/test/api', {
  id: '123'
}).then(res => {
  console.error(res, '请求成功')
}).catch(err => {
  console.error(err, '请求错误')
});
复制代码

GIT 还有其它一些公共的 函数封装,和日常使用的类库。 github.com/cgh1999520/…



转载于:https://juejin.im/post/5cce99e0e51d456e4c4c00b9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Promise 封装 Ajax 是一种常见的异步编程方式,可以通过 Promise 对象来处理 Ajax 请求的功和失败。具体实现方式可以参考以下代码: ``` function ajax(url, method, data) { return new Promise(function(resolve, reject) { var xhr = new XMLHttpRequest(); xhr.open(method, url, true); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(xhr.responseText); } else { reject(xhr.statusText); } } }; xhr.onerror = function() { reject(xhr.statusText); }; xhr.send(data); }); } ``` 使用时可以这样调用: ``` ajax('/api/data', 'GET') .then(function(response) { console.log(response); }) .catch(function(error) { console.error(error); }); ``` 这样就可以通过 Promise 封装 Ajax 请求,实现更加优雅的异步编程。 ### 回答2: Promise是一种用于处理异步操作的封装工具,它可以帮助我们更好地管理和处理异步任务。而Ajax是一种用于实现前端与后端数据交互的技术,通过发送HTTP请求来获取数据并在页面上进行展示。 将Promise封装Ajax可以带来以下好处: 1.简化代码:传统的Ajax代码往往会包含大量的回调函数,逻辑复杂且难以维护。使用Promise封装Ajax可以将异步操作分离出来,并以一种更加直观和一致的方式处理异步任务,使代码更加简洁明了。 2.提高可读性:Promise提供了then和catch等方法来处理异步任务的功和失败,可以将异步操作的处理逻辑写在链式调用中,使代码的逻辑更加清晰易懂。 3.异常处理:通过Promise的catch方法,可以捕获到异步任务中的异常并进行统一的处理,避免异常被控制流终止。 下面是一个使用Promise封装Ajax的示例代码: ```javascript function ajax(url, method, data) { return new Promise(function(resolve, reject) { var xhr = new XMLHttpRequest(); xhr.open(method, url, true); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(xhr.responseText); } else { reject(new Error(xhr.statusText)); } } }; xhr.send(data); }); } ajax('http://example.com/api', 'GET') .then(function(response) { console.log('请求功:', response); }) .catch(function(error) { console.log('请求失败:', error); }); ``` 以上代码中,ajax函数接受三个参数:url、method和data,通过XMLHttpRequest发送请求,并根据响应状态码进行相应的处理。使用Promise的resolve和reject来处理请求功和失败的情况,以便后续链式调用then和catch进行处理。这样就可以更加方便地管理和处理Ajax请求了。 ### 回答3: 封装PromiseAjax请求可以提供更加简洁和可读性高的代码,同时能够更好地处理异步操作和错误处理。下面是一个示例代码: ```javascript function ajax(url) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onload = function() { if (xhr.status === 200) { resolve(xhr.response); } else { reject(new Error(xhr.statusText)); } }; xhr.onerror = function() { reject(new Error('Network Error')); }; xhr.send(); }); } // 调用封装Ajax请求 ajax('https://api.example.com/data') .then(response => { console.log(response); }) .catch(error => { console.error(error); }); ``` 以上代码中,我们创建了一个`ajax`函数封装Ajax请求。该函数接受一个URL参数,并返回一个Promise对象。在函数内部,我们使用`XMLHttpRequest`对象来发送HTTP请求,并在请求完后处理响应和错误。 当请求功响应时,我们调用`resolve`函数将响应作为参数传递给Promise对象的`then`方法中的回调函数,从而能够在调用`ajax`函数后链式调用`then`方法获取响应数据。 当请求出现错误时,无论是网络错误还是HTTP状态码错误,我们都调用`reject`函数将错误信息作为参数传递给Promise对象的`catch`方法中的回调函数,在调用`ajax`函数后可以链式调用`catch`方法捕获错误并进行错误处理。 通过封装PromiseAjax请求,我们能够更加清晰地处理异步操作和错误处理,提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值