让前端飞饥人谷技术博客

Ajax、server-mock的使用

2017-09-01  本文已影响0人  _Dot912

ajax 是什么?有什么作用?

  1. AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),
    是一种技术的泛称,可以在不重新加载整个网页的情况下向服务器请求额外的数据,实现对网页的某部分进行更新,带来良好的用户体验。

AJAX和XMLHttpRequest的关系:
我们使用XMLHttpRequest对象来发送一个Ajax请求。

传统HTTP请求流程大概如下:

这些过程是同步的,会顺序执行。
AJAX在浏览器与web服务器之间使用异步数据传输(HTTP请求)从服务器获取数据,这里的异步指脱离当前浏览器页面的请求、加载等单独执行,这意味着可以在不重新加载整个网页的情况下通过JavaScript发送请求、接收服务器传来的数据,操作DOM将更新某部分网页的数据,使用AJAX对用户来说最直观的感受是获取新数据无需刷新页面。

  1. AJAX优缺点

前后端开发联调需要注意哪些事情?后端接口完成前如何 mock 数据?

在开发之前,前后端需要协作商定数据和接口的各项细节,后端负责提供数据,前端负责展示数据(根据数据负责页面的开发)

点击按钮,使用 ajax 获取数据,如何在数据到来之前防止重复点击?

初始时上锁,请求开始时解锁,请求结束时继续上锁,注意代码的执行顺序与书写顺序并不一致,涉及到异步的代码总是后执行,比如下列代码中,ajax部分会先执行open和send和lock=false,后执行onload和onerror

//添加一个状态锁,初始为true,上锁为true,解锁为false
var lock = true
btn.addEventListener('click', function () {
    //状态为false时直接return
    if (!lock) {
        return
    }
    var xhr = new XMLHttpRequest()
    xhr.open('GET', url, true)
    xhr.onload = function () {
        //状态正确时拿到结果,此次请求结束,上锁
        if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
            console.log(xhr.responseText)
        } else {
            console.log('error')
        }
            lock = true
    }
    xhr.onerror = function () {
        console.log('error')
    }
    xhr.send()
    //解锁,这时候请求开始
    lock = false
})

封装ajax

function ajax() {
  var url = opts.url
  var data = opts.data || {}
  var type = opts.type || 'GET'
  var dataType = opts.dataType || 'json'
  var onsuccess = opts.onsuccess || function () { }
  var onerror = opts.onerror || function () { }

  var dataStr = []
  for (var key in data) {
    dataStr.push(key + '=' + data[key])
  }
  dataStr = dataStr.join('&')

  if (type === 'GET') {
    url += '?' + dataStr
  }//get方法将字符串放在url末尾

  var xhr = new XMLHttpRequest()
  xhr.open(type, url, true)
  xhr.onload = function () {
    if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
      if (dataType === 'json') {
        onsuccess(JSON.parse(xhr.responseText))
      } else {
        onsuccess(xhr.responseText)
      }
    } else {
      onerror()
    }
  }
  xhr.onerror = onerror

  if (type === 'POST') {
    xhr.send(dataStr)//post方法将字符串放在send中
  } else {
    xhr.send()//get的send内容
  }
}

ajax({
  url: 'http://api.jirengu.com/weather.php',
  data: {
    city: '北京'
  },
  onsuccess: function (ret) {
    console.log(ret)
  },
  onerror: function () {
    console.log('服务器异常')
  }
})

实现加载更多的功能,后端在本地使用server-mock来模拟数据


参考资料

上一篇 下一篇

猜你喜欢

热点阅读