AJAX(二)

1.JS 可以设置任意请求 header 吗
第一部分 request.open('get', '/xxx')
第二部分 request.setHeader('content-type','x-www-form-urlencoded')
第四部分 request.send('a=1&b=2')
2.JS 可以获取任意响应 header 吗?
第一部分 request.status / request.statusText
第二部分 request.getResponseHeader() / request.getAllResponseHeaders()
第四部分 request.responseText


模拟封装实现jQuery的AJAX方法

window.jQuery.ajax = function (url, method, body, successFn, failFn) {
  let request = new XMLHttpRequest()
  request.open(method, url)
  request.onreadystatechange = () => {
    if (request.readyState === 4) {
      if (request.status >= 200 && request.status <300) {
        successFn.call(undefined,request.responseText)
      } else if (request.status >= 400) {
        failFn.call(undefined,request)
      }
    }
  }
  request.send(body)
}

btn.addEventListener('click', (e) => {
  window.jQuery.ajax(
    '/xxx',
    'POST',
    'a=1&b=2',
    (responseText)=>{console.log(1)},
    (request)=>{console.log(3)}
  )此处传入的参数太多
})

简易的ajax封装做好了,不过上面的参数过多,可能一不小心就会忘掉或者记混掉,
因此不需要传这么多参数,给我传一个有结构的参数就行了,就是对象!

window.jQuery.ajax = function (options) {
  let url = options.url
  let method = options.method
  let body = options.body
  let successFn = options.successFn
  let failFn = options.failFn


  let request = new XMLHttpRequest()
  request.open(method, url)
  request.onreadystatechange = () => {
    if (request.readyState === 4) {
      if (request.status >= 200 && request.status <300) {
        successFn.call(undefined,request.responseText)
      } else if (request.status >= 400) {
        failFn.call(undefined,request)
      }
    }
  }
  request.send(body)
}

btn.addEventListener('click', (e) => {
  let obj = {
    url:'/xxx',
    method:'get',
    successFn:()=>{},
    failFn:()=>{}
  }
  window.jQuery.ajax(obj)
})

给参数命名!
因为obj只用了一次,所以没有必要定义这个对象,可以直接把对象传进去

btn.addEventListener('click', (e) => {
    window.jQuery.ajax({
      url: '/xxx',
      method: 'get',
      successFn: () => {},
      failFn: () => {}
    })
})

设置请求头

如何设置请求头 ,输入一个header哈希,在原函数发送请求前遍历改变
window.jQuery.ajax({
      url: '/xxx',
      method: 'get',
      headers:{
        'Content-type':'application/x-www-form-urlencoded',
        'frank':'18'
      },
      successFn: (x) => {
      },
      failFn: (x) => 
      }
    })

    request.open(method, url)
  
  //设置请求头,一定要在open后面
  for(let key in headers){
    let value = headers[key]
    request.setRequestHeader(key,value)
  }

callback =>函数
即使是404 也会有响应

如何接受两种参数
window.jQuery.ajax = function (options) {
  let url = options.url
  if(arguments.length === 1){
    url = options.url
  }else if(arguments.length === 2){
    url = arguments[0]
    options = arguments[1]
  }

es6解构赋值

我们发现前面传入一个对象,运用多次赋值语句,很麻烦,看起来很蠢!

window.jQuery.ajax = function (options) {
  let url = options.url
  let method = options.method
  let body = options.body
  let successFn = options.successFn
  let failFn = options.failFn
  let headers = options.headers
 // es6解构赋值 上面6句等于下面一句
  let  {url,method,body,successFn,failFn,headers} = options

es6解构赋值 上面6句等于下面一句,那么问题来了,options声明之后只用了一次,有点尴尬,不如不用,直接把{}包起来的放到参数里

window.jQuery.ajax = function ({url,method,body,successFn,failFn,headers}) {}

var x = '???'
var o = {}
o[x] = true // '???' as key // es5 写法

体会一下两者的区别

var x = '???'
var o = {
[x]:true // 让x的值做key value 是true
}


promise

因为上面封装的ajax的回调函数名字不固定,有许许多多的库,他们的成功回调函数和失败回调函数名字千奇百怪,要想用的话,必须每个都要看文档,所以出现了promise

btn.addEventListener('click', (e) => {
    $.ajax({
      url: '/xxx',
      type: 'get',
    }).then((responseText)=>{console.log(responseText},
      (request)=>{console.log(request)})
})
AJAX(二)_第1张图片
image.png

promise的作用
1.简化了操作,不需要再去起成功和失败的函数名字了,直接接一个then(f1,f2) f1成功时执行 f2 失败时执行

2.执行了then后面可以继续用then执行其他函数

    $.ajax({
      url: '/xxx',
      type: 'get',
    }).then((responseText)=>{
      console.log(responseText)
      return responseText
    },(request)=>{
      console.log(request)
      return '已经处理'
    }).then((上一次处理的结果)=>{
      console.log(上一次处理的结果)//上一次处理的结果就是第一个then返回的responseText
    },(request)=>{
      console.log(request)
    })
AJAX(二)_第2张图片
image.png

如图所示,输出了两次responseText

JQuery会智能地把传到浏览器的json字符串解析成对象

---升级promise对象 return new Promise()

window.jQuery.ajax = function ({url,method,body,headers}) {

  return new Promise(function(resolve,reject){
    let request = new XMLHttpRequest()
    request.open(method, url)
    //设置请求头
    for (let key in headers) {
      let value = headers[key]
      request.setRequestHeader(key, value)
    }
    request.onreadystatechange = () => {
      if (request.readyState === 4) {
        if (request.status >= 200 && request.status < 300) {
          resolve.call(undefined, request.responseText)
        } else if (request.status >= 400) {
          reject.call(undefined, request)
        }
      }
    }
    request.send(body)
  })
}

btn.addEventListener('click', (e) => {
  let promise = window.jQuery.ajax({
        url: '/xxx',
        type: 'get',
        headers:{
          'Content-type':'application/x-www-form-urlencoded',
          'frank':'18'
        }
      })
      
  promise.then(
      (text)=>{console.log(text)},
      (request)=>{console.log(request)}
  )
})

你可能感兴趣的:(AJAX(二))