最近做js开发的时候发现了很多哥们不能区分同步和异步的区别,典型的在ajax部分,在该ajax为异步操作的时候,获取不到success之后的data的值,于是产生了各种奇葩的写法。比如创建一个局部变量再返回,然而并不觉得有什么用。还有的是将这个异步操作改成同步操作,然后获取data的值,平心而论,的确是可以这么做,不过如果这个ajax需要拉取大量的数据的时候,很容易就出现页面卡死的情况。所以,为了帮助初学者处理这个问题(减少坑爹的代码),才有了这个博客。

1:同步和异步的区别

首先,js是一个单线程的执行环境,即一次只能执行一个任务。如果有数个任务,那么这些任务会从上至下依次挨个执行。这种执行方式的好处是简单,实现也简单,缺点是这个如果有大量的任务,或者其中一个任务耗时时间很长,其他的任务暂时无法执行,就会造成浏览器无响应(俗称假死,卡死)。

针对这种情况,js出现了同步和异步的概念。"同步模式"就是上一段的模式,后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的;"异步模式"则完全不同,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。

2:ajax async:true的解决方法

对于如下代码段看这篇博客的人应该都很熟悉:

  1. </pre><pre name="code" class="javascript">function getData()
  2. {
  3. var getdata;
  4. $.ajax({
  5. type:"post",
  6. url:"url",
  7. data:{
  8. param1:param1,
  9. param2:param2
  10. },
  11. async:true,
  12. dataType:"json",
  13. success:function(data){
  14. getdata = data;
  15. }
  16. });
  17. return getdata;
  18. };
  1. </pre><span style="white-space:pre">    </span>通过向url传param1和2的值,这个ajax操作为异步操作,成功后将data的值返回,造成了我在别处调用了这个function,就能获取这个data的值得假象,还是too young啊。当在别处调用这个function的时候,总是惊讶的发现:哎?我这边控制台明明打印出了data的值啊,为什么不能用呢?然后就是这个debug找错,找了半天也没找到,于是乎尝试着把async改成了false,后来发现还是没有什么用。</p><p><span style="font-size:12px;"></span></p><p><span style="font-size:12px;"><span style="white-space:pre">   </span>实际上,针对这种情况,推荐的一种解决方法就是传入回调函数,将依赖于这个data的各种代码放到一个回调函数里面,然后执行如下的代码</span></p><p><span style="font-size:12px;"></span><pre name="code" class="javascript">function getData(callback)
  2. {
  3. $.ajax({
  4. type:"post",
  5. url:"url",
  6. data:{
  7. param1:param1,
  8. param2:param2
  9. },
  10. async:true,
  11. dataType:"json",
  12. success:function(data){
  13. callback(data);
  14. }
  15. });
  16. };

然后在你代码其他地方这么写:

  1. //getData(callback)上面的代码
  2. getData(callback);
  3. //跟ajax data无关的代码

于是乎你要的data全部传到callback里面执行,而不依赖data的代码不管你这个ajax,向下接着执行。

js异步获取数据的问题的更多相关文章

  1. ajax异步获取数据后动态向表格中添加数据(行)

    因为某些原因,项目中突然需要做自己做个ajax异步获取数据后动态向表格中添加数据的页面,网上找了半天都没有 看到现成的,决定自己写个例子 1.HTML页面 <!doctype html> ...

  2. MVC—实现ajax+mvc异步获取数据

    之前写过ajax和一般处理程序的结合实现前后台的数据交换的博客,如今做系统用到了MVC,同一时候也用到了异步获取数据. ajax+一般处理程序与MVC+ajax原理是一样的在"URL&quo ...

  3. node 创建静态web服务器(下)(处理异步获取数据的两种方式)

    接上一章. 上一章我们说创建的静态web服务器只能识别html,css,js文件,功能较为单一,且图片格式为text/html,这是不合理的. 本章,我们将解决该问题. 这里,我们先准备好一个json ...

  4. datatables异步获取数据、简单实用

    IKC项目总结 一.认证难题管理模块 1. 如何使用datatables进行获取数据内容 datatables简介:Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何H ...

  5. Vue Router路由守卫妙用:异步获取数据成功后再进行路由跳转并传递数据,失败则不进行跳转

    问题引入 试想这样一个业务场景: 在用户输入数据,点击提交按钮后,这时发起了ajax请求,如果请求成功, 则跳转到详情页面并展示详情数据,失败则不跳转到详情页面,只是在当前页面给出错误消息. 难点所在 ...

  6. nettyclient异步获取数据

    源代码见,以下主要是做个重要代码记录 http://download.csdn.net/detail/json20080301/8180351 NETTYclient获取数据採用的方式是异步获取数据, ...

  7. 用redux-thunk异步获取数据

    概述 最近学习redux,打算用redux-thunk给todo添加异步获取数据组件.记录下来,供以后开发时参考,相信对其他人也有用. 注意: 在todo下方,我异步获取我的react博客的标题,点击 ...

  8. IOS开发---菜鸟学习之路--(十二)-利用ASIHTTPRequest进行异步获取数据

    想要实现异步获取的话我这边了解过来有两个非常简单的方式 一个是利用ASIHTTPRequest来实现异步获取数据 另一个则是利用MBProgressHUD来实现异步获取数据 本章就先来讲解如何利用AS ...

  9. egg.js异步请求数据

    之前已经简单的使用egg-init初始化项目,并创建控制器controller和服务service 在实际项目中, service主要负责数据的请求,并处理(http请求) controll主要负责获 ...

随机推荐

  1. 【BZOJ1996】[Hnoi2010]chorus 合唱队 区间DP

    [BZOJ1996][Hnoi2010]chorus 合唱队 Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Ou ...

  2. 【Trello】使用指南

    一.谷歌浏览器插件推荐: Card Color Titles for Trello 在Card上现实标签的标题文字 Trellists: Trello Lists Master 允许展示和隐藏List ...

  3. 巨蟒python全栈开发flask2

    内容回顾: 上节回顾: Flask .response 三剑客: render_template 模板 redirect 重定向 - URL地址 "" 字符串 HTTPRespon ...

  4. OracleUNDO

    UNDO作用 数据的回滚 一致性读 表的闪回(事务,查询的闪回....) 失败会话的恢复 数据的回滚 SQL> rollback; 回滚的过程就是从回滚段里拿到刚刚执行的这条语句产生的回滚,然后 ...

  5. jq左右按钮点击幻灯片

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  6. 原生js实现ajax方法

    下面是一个比较完整的Ajax function ajax(){ var ajaxData = { type:arguments[0].type || "GET", url:argu ...

  7. Delphi日期设置为NULL

    在某些情况下,需要将日期字段的值置空,这种操作比较麻烦.在操作的时候,可将变量的值(t:TDateTime)设置为0,在操作的过程中进行判断,当t的值为0或-1的时候,时间值为1899年的Delphi ...

  8. redis中默认有多少个哈希槽?

    Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余 ...

  9. mysql 关于join的总结

    本文地址:http://www.cnblogs.com/qiaoyihang/p/6401280.html mysql不支持Full join,不过可以通过UNION 关键字来合并 LEFT JOIN ...

  10. sizeof 是编译时运算符

    typedef char RT1;typedef struct{ char a[2]; } RT2;template<typename T> RT1 test(typename T::X ...