jQuery.when() 是不是对这些函数调用进行排队?
Posted
技术标签:
【中文标题】jQuery.when() 是不是对这些函数调用进行排队?【英文标题】:Does jQuery.when() queue these function calls?jQuery.when() 是否对这些函数调用进行排队? 【发布时间】:2014-08-20 02:10:01 【问题描述】:根据 jQuery 文档:
To execute a function after two ajax requests are successful:
$.when($.ajax("/page1.php"), $.ajax("/page2.php")).done(function(a1, a2)
/* a1 and a2 are arguments resolved for the
page1 and page2 ajax requests, respectively */
var jqXHR = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */
if ( /Whip It/.test(jqXHR.responseText) )
alert("First page has 'Whip It' somewhere.");
);
我有这个:
$.when(
file2store('resources/states_obj.txt?v=2', 'states'),
file2store('resources/lgas_obj.txt?v=2', 'lgas'),
file2store('resources/villages_obj.txt?v=2', 'villages'),
file2store('resources/staff_obj.txt?v=2', 'staff')
).done(function()
console.log('All data put');
);
function file2store(url, store_name)
$.getJSON(url, function(obj)
db.put(store_name, obj).then(
function(ids)
console.log(store_name+': '+ids.length + ' items put.');
, function(e)
throw e;
);
);
ajax 回调中的变量db
是indexedDB Storage 对象的全局变量,在脚本顶部获得(此处未显示)。
这是 jQuery Deferred
构造的正确用法吗?
函数调用file2store
是否会排队,也就是说,确保一个调用在下一个调用之前完成?
【问题讨论】:
一个没有显式返回语句的函数返回undefined
,正如所写的那样,这就是file2store
的作用。 jQuery.when()
接受 Promise 作为其参数,因此要使您的代码正常工作,file2store
必须返回一个 Promise - 即 return db.put(...).then(...);
旁注...希望您知道 indexedDB.open 也是异步的,并且您的“db”变量不能保证在您访问它的时间点被定义和打开。
【参考方案1】:
这是 jQuery Deferred 构造的正确用法吗?
不完全是。 when()
方法接受 deferred
对象,该对象是从创建 AJAX 请求的 jQuery 方法返回的。因此,您需要 return
该对象才能使您的代码正常工作:
function file2store(url, store_name)
return $.getJSON(url, function(obj) // note the return here.
// rest of your code...
);
函数调用 file2store 是否会排队,也就是说,确保一个调用在下一个调用开始之前完成?
没有。它们是按照您提供它们的顺序创建的,但是它们将按照服务器响应它们的任何顺序完成。
【讨论】:
我明白了。然后返回的 jqXHR 对象可以作为.done(function(a, b, c, d) //do stuff with a, b, c or d );
传递。因此,除了您提出的观点之外,db.put()
是$.ajax()
异步例程中的嵌套异步例程如何影响事物?例如。数据可以从它内部返回到外部范围???猜猜不是,Outch!!!
跟进:我猜db.put()
确实应该从那个内部范围中提取出来,而是我们应该这样做:.done(function(a, b, c, d) //pass the respective response JSON obj to its own
db.put()` 在这个地方);` .对吗?
我不得不接受你的回答,因为我认为它实际上是正确的,解决了我提出的具体问题。在引导我找到最终解决方案方面也非常有用。不过,必须说,我一直在期待关于我最后几个 cmets 对您的回答的后续意见。干杯!以上是关于jQuery.when() 是不是对这些函数调用进行排队?的主要内容,如果未能解决你的问题,请参考以下文章