ajax同步还是异步?

前端开发接触有一段时间了,一直想搞明白一个关于ajax同步异步的问题,异步无法确保数据A成功返回,需要用到A的地方就无法进行相应处理;若使用同步请求,则失去异步请求快速不等待的优点,程序在值被返回后继续执行。
我的想法是,有些js框架可以监听对象属性,可以一些依赖返回数据的函数放在监听函数中,当监听的属性有值以后再执行。
不知道有没有其他的比较好的处理方式,有相同疑惑的可以一起讨论,希望大神们不吝相告啊

阅读 6.1k
6 个回答

不考虑async等语法的前提下。

  1. 异步本来就没返回值(或者说返回值不是你想要的结果),你的意思应该是无法保证异步请求返回数据与其他逻辑的顺序吧。
    然而异步操作一般都是和回调函数绑定使用的,所有依赖返回结果的方法都要在回调函数中进行,你当然可以把返回结果在回调中赋值给外层变量。
    同时你说的监听对象属性等,本身也是个异步操作,只不过是将原本函数回调中的一些职责转移到了监听的回调里,因为你本来就可以在原本函数的回调中进行这些依赖返回值得函数的调用。
  2. 同步ajax请求用的比较少,唯一用过一次是在做访问记录时,页面关闭前确保请求发送成功时。

不知道是不是你需要的。jquery 有一个deffered对象。

$.when($.ajax("/echo/html/"), $.ajax("/echo/xml/"))

  .done(function(){ alert("哈哈,成功了!"); })

  .fail(function(){ alert("出错啦!"); });
异步无法确保数据A成功返回,需要用到A的地方就无法进行相应处理

这个只有很少的情况会遇到。与这个缺点相比,同步会让页面失去响应的缺点明显更严重。现在已经不再鼓励使用同步了。

其实结合Promise,异步的处理也可以简化很多。

你需要得到返回数据再处理,可以放在ajax请求成功后,处理需要A数据的逻辑,回调函数,Promise都是解决办法

加载数据时可以给一个加载动画, 加载成功后刷新显示, 加载失败给出相应提示

    load() {
      // 开始加载动画
      ajaxFetchData()
        .then(data => {
          // 渲染界面
        })
        .catch(err => {
          // 错误提示
        })
        .finally(() => {
          // 结束加载动画
        });
    }

综合各位的回复,很有收获。也怪自己好久没去翻jquery API了。总之,谢谢各位 :)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进