• Web前端笔试整理13 promise封装ajax


    HTML5的Web存储对象有两个,分别是

    • localStorage
    • sessionStorage

    Http请求返回码(status code)中,代表【未授权的请求】的代码是

    401

    CSS3中,能使用div的宽度变化有2秒的过度效果的属性是

    transition

    描述一下脚本<script>放在和放到底部的区别

    放<head>中的情况:脚本会优先加载,但加载过程中,还没加载完,会使脚本访问不到中的元素。

    放底部:脚本在加载后加载,能够保证脚本有效地访问元素。

    例外情况:脚本中没有访问元素的情况下,两种加载方式效果一致。

    使用Promise封装Ajax操作

    原始的Ajax操作如下:

    var onSuccess = function (result) {}; // 成功的回调
    var onFail = function (error) {}; // 失败的回调
    var req = new XMLHttpRequest();
    req.open("POST", "www.baidu.com", true);
    req.onload = function () {
      if (req.readyState === 4 && req.status === 200) {
        onSuccess(req.response);
      } else {
        onFail(req.statusText);
      }
    };
    req.onerror = function () {
      onFail(Error("网络异常"));
    };
    

    封装后:

    // ajax函数的默认参数
    var ajaxOptions = {
      url: "#",
      method: "GET",
      async: true,
      timeout: 0,
      data: null,
      dataType: "text",
      headers: {},
      onprogress: function () {},
      onuploadprogress: function () {},
      xhr: null,
    };
    // 使用Promise封装
    function ajax(optionsOverride) {
      // 将传入的参数与默认设置合并
      var options = {};
      for (var k in ajaxOptions) {
        options[k] = optionsOverride[k] || ajaxOptions[k];
      }
      options.async = opsiotn.async === false ? false : true;
      var xhr = (options.xhr = options || new XMLHttpRequest());
      return new Promise(function (resolve, reject) {
        xhr.open(options.method, options.url, options.async);
        xhr.timeout = opstions.timeout;
        // 设置请求头
        for (var k in opstions.headers) {
          xhr.setRequestHeader(k, opstions.headers[k]);
        }
        // 注册xhr对象事件
        xhr.onprogress = options.onprogress;
        xhr.upload.onprogress = opstions.onuploadprogress;
        xhr.responseType = options.dataType;
        xhr.onabort = function () {
          reject(
            new Error({
              errorType: "abort_error",
              xhr: xhr,
            })
          );
        };
        xhr.ontimeout = function () {
          reject({
            errorType: "timeout_error",
            xhr: xhr,
          });
        };
        xhr.onloadend = function () {
          if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304)
            resolve(xhr);
          else {
            reject({
              errorType: "status_error",
              xhr: xhr,
            });
          }
        };
        try {
          xhr.send(options.data);
        } catch (e) {
          reject({
            errorType: "send_error",
            error: e,
          });
        }
      });
    }
    // 使用
    ajax({
      url: "http://localhost:3000/suc",
      async: true,
      onprogress: function (evt) {
        console.log(evt.position / evt.total);
      },
      dataType: "text/json",
    }).then(
      function (xhr) {
        console.log(xhr.response.name);
      },
      function (e) {
        console.log(JSON.stringify(e));
      }
    );
    
  • 相关阅读:
    OData的初步认识
    ABP源码分析二十五:EventBus
    ABP源码分析二十四:Notification
    ABP源码分析二十三:Authorization
    ABP源码分析二十二:Navigation
    ABP源码分析二十一:Feature
    160. 相交链表
    83. 删除排序链表中的重复元素
    21. 合并两个有序链表
    字典(dict)常用操作
  • 原文地址:https://www.cnblogs.com/xiaoxu-xmy/p/13712280.html
Copyright © 2020-2023  润新知