我有一个应用程序需要按特定顺序加载数据:根 URL,然后是模式,最后使用各种数据对象的模式和 url 初始化应用程序。当用户浏览应用程序时,数据对象被加载、根据模式验证并显示。当用户对数据进行 CRUD 时,模式提供了首次验证。
我在初始化时遇到问题。我使用Ajax 调用来获取根对象$.when(),然后创建一个promise 数组,每个schema 对象一个。这样可行。我在控制台中看到了 fetch。
然后我看到所有模式的获取,所以每个 $.ajax() 调用都有效。fetchschemas() 确实返回了一组承诺。
但是,最后的 when() 子句永远不会触发,并且“DONE”这个词永远不会出现在控制台上。jquery-1.5 的源代码似乎暗示“null”作为传递给 $.when.apply() 的对象是可接受的,因为当没有对象时 when() 将构建一个内部 Deferred() 对象来管理列表通过了。
这使用 Futures.js 有效。如果不是这样,应该如何管理 jQuery Deferreds 数组?
var fetch_schemas, fetch_root;
fetch_schemas = function(schema_urls) {
var fetch_one = function(url) {
return $.ajax({
url: url,
data: {},
contentType: "application/json; charset=utf-8",
dataType: "json"
});
};
return $.map(schema_urls, fetch_one);
};
fetch_root = function() {
return $.ajax({
url: BASE_URL,
data: {},
contentType: "application/json; charset=utf-8",
dataType: "json"
});
};
$.when(fetch_root()).then(function(data) {
var promises = fetch_schemas(data.schema_urls);
$.when.apply(null, promises).then(function(schemas) {
console.log("DONE", this, schemas);
});
});