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对象,则直接作为回调函数的参数。
d = $.Deferred() $.when(d, 'World').done(function (s1, s2){ console.log(s1); console.log(s2); }) d.resolve('Hello') // Hello // World
上面代码中,when的第二个参数是一个字符串,则直接作为回调函数的第二个参数。
此外,如果when方法的参数都不是deferred或promise对象,那么when方法的回调函数将立即运行。
5 使用实例
wait方法我们可以用deferred对象写一个wait方法,表示等待多少毫秒后再执行。
$.wait = function(time) { return $.Deferred(function(dfd) { setTimeout(dfd.resolve, time); }); }
使用方法如下。
$.wait(5000).then(function() { console.log("Hello from the future!"); });
在上面的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接口,使得任意操作都可以用done()和fail()指定回调函数。
Twitter = { search:function(query) { var dfd = $.Deferred(); $.ajax({ url:"http://search.twitter.com/search.json", data:{q:query}, dataType:'jsonp', success:dfd.resolve }); return dfd.promise(); } }
使用方法如下。
Twitter.search('').then(function(data) { alert(data.results[0].text); });
deferred对象的另一个优势是可以附加多个回调函数。下面的例子使用了上面所改写的setTimeout函数。
function doSomething(arg) { var dfd = $.Deferred(); setTimeout(function() { dfd.reject("Sorry, something went wrong."); }); return dfd; } doSomething("uh oh").done(function() { console.log("Won't happen, we're erroring here!"); }).fail(function(message) { console.log(message); });
jQuery.Deferred对象
标签: 回调 回调函数本文链接