【发布时间】: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”变量不能保证在您访问它的时间点被定义和打开。
标签: jquery indexeddb deferred ydn-db