jQuery技术

jQuery之Deferred对象详解_jquery(3)

字号+ 作者:H5之家 来源:H5之家 2016-07-24 14:00 我要评论( )

$.when( $.ajax( "/main.php" ), $.ajax( "/modules.php" ), $.ajax( "/lists.php" ) ).then(, failureFunc); 上面代码表示,要等到三个ajax操作都结束以后,才执行then方法指定的回调函数。 when方法里面要执行多


$.when(
    $.ajax( "/main.php" ),
    $.ajax( "/modules.php" ),
    $.ajax( "/lists.php" )
).then(, failureFunc);

上面代码表示,要等到三个ajax操作都结束以后,才执行then方法指定的回调函数。

when方法里面要执行多少个操作,回调函数就有多少个参数,对应前面每一个操作的返回结果。

复制代码 代码如下:


$.when(
    $.ajax( "/main.php" ),
    $.ajax( "/modules.php" ),
    $.ajax( "/lists.php" )
).then(function (resp1, resp2, resp3){
    console.log(resp1);
    console.log(resp2);
    console.log(resp3);
});

上面代码的回调函数有三个参数,resp1、resp2和resp3,依次对应前面三个ajax操作的返回结果。

when方法的另一个作用是,如果它的参数返回的不是一个Deferred或Promise对象,那么when方法的回调函数将 立即运行。

复制代码 代码如下:


$.when({testing: 123}).done(function (x){
  console.log(x.testing); // "123"
});

上面代码中指定的回调函数,将在when方法后面立即运行。

利用这个特点,我们可以写一个具有缓存效果的异步操作函数。也就是说,第一次调用这个函数的时候,将执行异步操作,后面再调用这个函数,将会返回缓存的结果。

复制代码 代码如下:


function maybeAsync( num ) {
  var dfd = $.Deferred();
  if ( num === 1 ) {
    setTimeout(function() {
      dfd.resolve( num );
    }, 100);
    return dfd.promise();
  }
  return num;
}
$.when(maybeAsync(1)).then(function (resp){
  $('#target').append('<p>' + resp + '</p>');
});
$.when(maybeAsync(0)).then(function (resp){
  $('#target').append( '<p>' + resp + '</p>');
});

上面代码表示,如果maybeAsync函数的参数为1,则执行异步操作,否则立即返回缓存的结果。

实例

wait方法

我们可以用deferred对象写一个wait方法,表示等待多少毫秒后再执行。

复制代码 代码如下:


$.wait = function(time) {
  return $.Deferred(function(dfd) {
    setTimeout(dfd.resolve, time);
  });
}


使用方法如下:

复制代码 代码如下:


$.wait(5000).then(function() {
  alert("Hello from the future!");
});

改写setTimeout方法

在上面的wait方法的基础上,还可以改写setTimeout方法,让其返回一个deferred对象。

复制代码 代码如下:


function doSomethingLater(fn, time) {
  var dfd = $.Deferred();
  setTimeout(function() {
    dfd.resolve(fn());
  }, time || 0);
  return dfd.promise();
}
var promise = doSomethingLater(function (){
  console.log( '已经延迟执行' );
}, 100);

自定义操作使用deferred接口

我们可以利用deferred接口,使得任意操作都可以用done()和fail()指定回调函数。

复制代码 代码如下:


Twitter = {
  search:function(query) {
    var dfr = $.Deferred();
    $.ajax({
     url:"http://www.020jz.org/",
     data:{q:query},
     dataType:'jsonp',
     :dfr.resolve
    });
    return dfr.promise();
  }
}

使用方法如下:

复制代码 代码如下:


Twitter.search('intridea').then(function(data) {
  alert(data.results[0].text);
});


deferred对象的另一个优势是可以附加多个回调函数。

复制代码 代码如下:


function doSomething(arg) {
  var dfr = $.Deferred();
  setTimeout(function() {
    dfr.reject("Sorry, something went wrong.");
  });
  return dfr;
}
doSomething("uh oh").done(function() {
  alert("Won't happen, we're erroring here!");
}).fail(function(message) {
  alert(message)
});

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  •  jquery施用技巧

    jquery施用技巧

    2016-07-23 15:08

  • jQuery技术内幕:深入解析jQuery架构设计与实现原理 PDF扫描版[120MB]

    jQuery技术内幕:深入解析jQuery架构设计与实现原理 PDF扫描版[120MB

    2016-07-23 14:00

  • jquery方法之remove()方法详解

    jquery方法之remove()方法详解

    2016-07-22 11:05

  • jQuery针对各类元素操作基础教程_jquery

    jQuery针对各类元素操作基础教程_jquery

    2016-07-18 16:00

网友点评
}