最佳答案
我有一个应用程序,它要求按照一定的顺序加载数据: 根 URL,然后是模式,最后用各种数据对象的模式和 URL 初始化应用程序。当用户导航应用程序时,将加载数据对象,根据架构进行验证,并显示数据对象。当用户 CRUDs 数据时,模式提供第一步验证。
初始化有问题。我使用 Ajax 调用来获取根对象 $。然后为每个模式对象创建一个承诺数组。这样就行了。我在控制台上看到了诱饵。
然后我看到所有模式的获取,因此每个 $。Ajax ()调用工程。Fetchschema ()确实返回一个承诺数组。
然而,最终的 when ()子句从未触发,并且“ DONE”这个词从未出现在控制台上。Jquery-1.5的源代码似乎暗示“ null”作为传递给 $的对象是可以接受的。Application () ,因为如果没有传入对象,when ()将构建一个内部 Deferred ()对象来管理列表。
如果不是这样,那么应该如何管理一个 jQuery Deferred 数组呢?
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);
});
});