前端开发

利用Promise知识,用原生JS封装Ajax

2018-10-14  本文已影响27人  番茄沙司a

Promise

1. Promise特点

利用Promise知识,用原生JS封装AJAX

var url = 'https://请求的路径';

// 封装一个get请求的方法
function getJSON(url) {
  return new Promise(function (resolve, reject) {
    var XHR = new XMLHttpRequest();

    XHR.onreadystatechange = function () {
      //readyState属性表示请求/响应过程的当前活动阶段。
      if (XHR.readyState == 4) {
        if ((XHR.status >= 200 && XHR.status < 300) || XHR.status == 304) {
          try {
            var response = JSON.parse(XHR.responseText);
            resolve(response);
          } catch (e) {
            reject(e);
          }
        } else {
          reject(new Error("Request was unsuccessful: " + XHR.status));
        }
      }
    }
    XHR.open('GET', url, true);
    XHR.send(null);
  })
}

getJSON(url).then(resp => console.log(resp));

readyState
0 - 代表未初始化。 还没有调用 open 方法
1 - 代表正在加载。 open 方法已被调用,但 send 方法还没有被调用
2 - 代表已加载完毕。send 已被调用。请求已经开始
3 - 代表交互中。服务器正在解析响应内容
4 - 代表完成。响应发送完毕

2. Promise 语法

以异步操作img为例

2.1 ES5 异步Callback实现

function loadImg(src, callback, fail) {
    var img = document.createElement('img')
    img.onload = function () {
        callback(img)
    }
    img.onerror = function () {
        fail()
    }
    img.src = src
}
var src = 'https://img.mukewang.com/5be2bcb30001a46709360316.jpg'
loadImg(src, function (img) {
    console.log(img.width)
}, function () {
    console.log('failed')
})

2.2 Promise实现

function loadImg(src) {
    const promise = new Promise(function (resolve, resolve) {
        var img = document.createElement('img')
        img.onload = function () {
            resolve(img)
        }
        img.onerror = function () {
            reject()
        }
        img.src = src
    })
    return promise
}


var src = 'https://img.mukewang.com/5be2bcb30001a46709360316.jpg'
var result = loadImg(src)

result.then(function (img) {
    console.log(img.width)
}, function () {
    console.log('failed')
})
result.then(function (img) {
    console.log(img.height)
})

优点:便于集成、扩展
注意:

2.3 重要语法

上一篇下一篇

猜你喜欢

热点阅读