(对于刚开始阅读此内容的任何人,此问题已解决-见底部)
我试图了解对 ajax 的调用中发生了什么。此代码遍历“绑定器”列表并从服务器获取每个。(目前服务器上只有一个活页夹。)
发生的情况是:大约有 60 秒的延迟,我可以与网页交互,但没有显示活页夹。最后出现了一个活页夹,但它的图像缩略图丢失了,我无法与之交互。
从调用“log”到控制台的输出是:
活页夹:正确的 URL,我必须在这里审查
紧接着,
getAllBinders:完成项目
即使在最终显示活页夹之后,也不会打印任何其他内容。这告诉我“完成”、“失败”或“总是”的方法都没有被激活。我知道正在显示一个活页夹,所以代码一定没有崩溃。(正确的?)
下面是代码:
function getAllBinders() {
var deferred = $.Deferred()
_.each(binderPreviews, function(item, index) {
console.log("Binder: "+ajaxPath+" "+item.url)
$.ajax({
xhrFields: {
withCredentials: true
},
type: 'get',
url: ajaxPath+item.url,
dataType: 'json',
contentType: "application/json",
crossDomain: true
})
.done(function( data, message, jqxhr ) {
console.log("getAllBinders Success!");
// Store the binder record with an index
$.extend(data, { order: index })
// Replace null properties with empty strings
_.each(data, function(value, prop, obj) {
if( value == null ) obj[ prop ] = ''
})
App.Binder.createRecord( data ).save()
// Check if it's the last call so we can resolve the activity
if( index == binderPreviews.length - 1 ) {
deferred.resolve()
console.log( ConferenceApp.Binder.records() )
}
console.log("getAllBinders Index: "+index+", Total: "+binderPreviews.length);
})
.fail(function(xhr, status, msg) {
console.log("getAllBinders Failure: "+status+", "+msg);
console.log("getAllBinders Index: "+index+", Total: "+binderPreviews.length);
})
.always(function() {
console.log("getAllBinders: ajax.always");
});
console.log("getAllBinders: Finished with item");
})
}
作为一个实验,我在 ajax 调用中添加了一个不可能的超时(如下所示)。我的控制台的输出是:
活页夹:正确的 URL,我必须在这里审查
getAllBinders:完成项目
getAllBinders 失败:超时,超时
getAllBinders 索引:0,总计:1
getAllBinders:ajax.always
$.ajax({
xhrFields: {
withCredentials: true
},
type: 'get',
url: ajaxPath+item.url,
dataType: 'json',
contentType: "application/json",
crossDomain: true,
timeout: 1 //Test -- this should be impossible
})
编辑:没关系,我发现了问题:/ App.Binder.createRecord 方法中有一个运行时错误,它一运行就崩溃了“完成”方法(但不是之前,这让我感到困惑)