首页 > 语言 > JavaScript > 正文

javascript异步处理与Jquery deferred对象用法总结

2024-05-06 15:38:29
字体:
来源:转载
供稿:网友

本文实例讲述了javascript异步处理与Jquery deferred对象用法。分享给大家供大家参考,具体如下:

这是项目组老大整理的一些关于jquery 异步处理请求,以及使用 jquery deferred 对象的一些常见方法。虽然是项目上总结出来的。但也比较通用,分享在这里。

所有的Ajax操作都采用异步处理。 采用Jquery的Deffered对象来处理异步调用。 因为是异步调用,所以$.Ajax函数的返回值不代表返回的结果,只是一个Deffered对象。 Ajax调用完成后执行的逻辑可以写成函数作为参数传递给Deffered对象的done(), fail(), always()函数来执行。 如果一个函数包含Ajax调用,那么这个函数必须将Ajax返回的异步对象作为自己的返回值,否则函数的调用者无法保证后续代码的正常执行顺序。

例如:

function readData(){  $.ajax({ url:"test", dataType:"json" })  .done(function() {    //....  });}readData();//...这里想添加一些后续处理,但程序将在Ajax回调前执行,所以无法达到预期目的正确的代码:function readData(){  return $.ajax({ url:"test", dataType:"json" })  .done(function() {    //....  });}readData().done(function () {  //...想添加的后续处理可以加在这里处理});
如果需要调用多个Ajax请求,请注意Ajax请求是否可以同时进行,如果可以应该使用when()函数来同时执行,以提高程序的运行效率和可读性。 deferred对象有一个方法promise(),可以阻止其他代码修改deferred对象的状态,也就是其他代码调用reslove()reject()无效。
var dtd = $.Deferred(); // 新建一个Deferred对象var wait = function(dtd){  var tasks = function(){    alert("执行完毕!");    dtd.resolve(); // 改变Deferred对象的执行状态  };  setTimeout(tasks,5000);  return dtd;};wait(dtd).done(function(){ alert("成功了!"); }).fail(function(){ alert("出错啦!"); });dtd.resolve();  //这里修改了dtd对象的状态,导致立刻出现“成功了!”的提示

正确的例子:

var dtd = $.Deferred(); // 新建一个Deferred对象var wait = function(dtd){  var tasks = function(){    alert("执行完毕!");    dtd.resolve(); // 改变Deferred对象的执行状态  };  setTimeout(tasks,5000);  return dtd.promise(); // 返回promise对象};wait(dtd).done(function(){ alert("成功了!"); }).fail(function(){ alert("出错啦!"); });dtd.resolve();  //这里修改dtd对象的状态无效
一些情况的处理:

1.嵌套异步操作的处理。

如果一个函数内部执行异步任务,并且在异步任务的done回调内会嵌套另一个异步任务,那么简单返回第一个异步任务的返回值是不行的,需要另外自行定义一个Deferred对象作为返回值。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选