jquery 1.5后增加了deferred 对象,处理延迟。给了我们一些代码组织新的机会。
首先复习一下ajax 原理。
ajax是通过http请求远程加载数据的一种方式。异步加载,不会阻塞文件中后续代码的执行。学习的时候突然想到js引擎是单线程的,不阻塞看起来感觉是并发的样子。于是又搜索了一番,找到了一篇很对症的文章。
js单线程深入分析
看完之后我的理解是,js引擎确实是单线程的,ajax执行时,会发起一个http请求这个请求会给浏览器,浏览器有一个自己的事件队列,浏览器把它放到自己的事件队列中去,等到浏览器空闲了才会执行,当异步事件触发之后(例如xmlhttprequest 完成,回调函数触发),又会进入js执行队列,等待执行。
因为js文件中的代码在本地,远程取得数据又收到很多因素的影响(网速,页面上其他异步事件)所以一般返回回来的时候,本地js文件都执行完了。

好了,回头说说deferred

以前的ajax用法

 function getCount(offerIds,callback) {$.ajax({url: url,data: {ids: ids},type: 'get',dataType: 'jsonp',success: function(json) {if (json && json.content) {callback(json.content);} else {return;}},error: function() {return;}})}

这样的写法,不能把数据单独封装成一个方法,也就是说,如果我以后想用这些数据做别的事情,就只能增加callback,或者替换callback。方法不够独立,解耦做的不够好。如果拿得到返回的数据,代码的组织就会更加的灵活。

deferred给了我们这样的机会。

 getCount(offeridList.join(',')).done(function(json) {rander(json.content);}).fail(function() {rander();});function getCount(offerIds) {var deferred = $.Deferred();$.ajax({url: url,data: {ids: offerIds},type: 'get',dataType: 'jsonp',success: function(json) {if (json && json.content) {deferred.resolve(json);} else {deferred.reject();}},error: function() {deferred.reject();}});return deferred.promise();}

deferred.promise() 返回一个deferred对象,只开放与改变执行状态无关的方法(比如done()方法和fail()方法),屏蔽了 resolve()和reject() 方法。

使deferred对象在ajax()外部不可以修改状态值。
这样就可以进行链式操作。done()和fail()相当于success,error 方法。deferred的好处是可以执行多个done()。链式调用,按顺序执行。

deferred.resolve()的意思是,将dtd对象的执行状态从”未完成”改为”已完成”,从而立刻触发done()方法。

如果是 .ajax().done().是不用自己手动修改deferred对象状态值的。因为 .ajax().done().是不用自己手动修改deferred对象状态值的。因为.ajax()就会返回一个deferred对象。但是如果把 .ajax()抽出来成为一个方法,就不行了,只能函数内部自己用 .ajax()抽出来成为一个方法,就不行了,只能函数内部自己用 .deferred()自己创建一个deferred对象,手动修改状态值,再return出去,实现链式调用。

ajax deferred 用法相关推荐

  1. Ajax是什么?Ajax高级用法之Axios技术

    Ajax AJAX 异步请求局部刷新 Ajax 参数详解 js.json.jsonp区别 json和jsonp的区别 同源策略 json和js对象的区别 Ajax高级用法(axios) 为什么要用Ax ...

  2. Ajax updatepanel用法

    局部更新是ajax技术的最基本,也是最重要的用法,今天把asp.net ajax中的局部更新控件 updatepanel的用法总结下,大家可以共同探讨 UpdatePanel控制页面的局部更新,这个更 ...

  3. 深入理解jQuery中$.get、$.post、$.getJSON和$.ajax的用法

    当我们用javascript写ajax程序写得很"开心"的时候,突然有人告诉你有一种东西叫jquery,它会告诉你不直接和HttpRequest是多么的快乐,同时你再也不需要再烦恼 ...

  4. ajax实战用法详解

    谦虚使人进步,总结使人提高! 以下5个方法执行一般Ajax请求的简短形式,在处理复杂的Ajax请求时应该使用jQuery.ajax() 1.load(url,[data],[callback]) 载入 ...

  5. $.get、$.post、$getJSON、$ajax的用法跟区别

    $.get $.get()方法使用GET方式来进行异步请求,它的语法结构为: $.get( url [, data] [, callback] ) 解释一下这个函数的各个参数: url:string类 ...

  6. js原生ajax与jquery的ajax的用法区别

    什么是ajax和原理? AJAX 是一种用于创建快速动态网页的技术. 通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据 XMLHttpRequest对象的基本属性: onre ...

  7. ajax基本用法介绍

    一.基于jQuery的ajax 此时需要在模板中引用jQuery,ajax的本质是利用浏览器自带的XMLHttpRequest对象并通过jQuery将数据和请求头进行封装再发送.ajax基本使用方法如 ...

  8. Ajax的用法之JQuery

    示例: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...

  9. 【原创】Ajax的用法总结

    一.什么是Ajax Ajax英文全称为" Asynchr JavsScript and XML"(异步的JavaScript和XML),是一种创建 交互式网页的开发技术. 二.Aj ...

最新文章

  1. STM32单片机真的落后?
  2. 评审关上了你CVPR的门?这还有Rebuttal的窗,7个小技巧送上
  3. hadoop +hbase +zookeeper 完全分布搭建 (版本一)
  4. 关于网站根目录下面robots.txt文件的作用
  5. Oracle常见操作汇总(转)
  6. linux expr格式,计算2-expr命令举例
  7. 路由器LED闪灯泄露数据
  8. ajax异步提交 java_jquery ajax异步上传
  9. 冲击波病毒内幕点滴(2) (转)
  10. Unity3D项目五:简单打飞碟
  11. 软件工程专业的论文答辩_软件工程专业本科毕业答辩?
  12. 关系型数据和文档型数据库有什么区别?
  13. 【电机原理与拖动基础】Unit 2 直流电机的电力拖动系统
  14. ior - POSIX文件系统测试工具
  15. C++实现RS485通信
  16. 运维工程师分享7道经典面试题,看完轻松拿Offer
  17. 第一篇博文 开启我的互联网世界【立志学好C语言的兵哥哥】
  18. C#错误之 System.Threading.ThreadAbortException:正在中止线程
  19. c语言寻峰算法,寻峰算法总结报告
  20. python 利用utf-8编码判断中文英文字符

热门文章

  1. ios逆向学习环境安装(一)
  2. 从赛马游戏看CyclicBarrier,从斗地主看CountDownLatch
  3. gff文件_gff/gtf格式
  4. Veins源码阅读—connectionManager模块
  5. how velero works
  6. 实现VS平台账号注册机
  7. Java SE 008 理解面向对象程序设计 (Inside Object Oriented Programming)
  8. 先做个“键盘侠”, 再来写程序
  9. STM32CubeIDE开发(十六),I2C协议采集传感器数据(SHTC1、LTR-553ALS、BMP280、LSM6DSL、MMC3680KJ)
  10. Bandit:一款Python代码安全漏洞检测工具