Javascript jQuery文件上载:调试添加回调中的间歇性“未初始化”错误
我正在使用jQuery文件上传和KnockoutJS构建一个资产管理器。问题是,当我上传一组文件时,我会在看似随机的时间收到异常Javascript jQuery文件上载:调试添加回调中的间歇性“未初始化”错误,javascript,knockout.js,jquery-file-upload,Javascript,Knockout.js,Jquery File Upload,我正在使用jQuery文件上传和KnockoutJS构建一个资产管理器。问题是,当我上传一组文件时,我会在看似随机的时间收到异常 Uncaught Error: cannot call methods on fileupload prior to initialization; attempted to call method 'process' 在集合中某个文件的添加回调的中间 每次将文件添加到上载队列时,我都会首先执行AJAX请求,以便在服务器上“预注册”新资产。之后,我调用jquery.
Uncaught Error: cannot call methods on fileupload prior to initialization; attempted to call method 'process'
在集合中某个文件的添加回调的中间
每次将文件添加到上载队列时,我都会首先执行AJAX请求,以便在服务器上“预注册”新资产。之后,我调用jquery.fileupload-process插件来执行客户端文件验证。简化:
function add(ev, data) {
// perform an AJAX request through the Knockout view model
viewModel.addAsset().done(function(asset) {
data.asset = asset;
}).done(function() {
data.process(function () {
return $element.fileupload('process', data); // EXCEPTION OCCURS HERE
}).done(function() {
data.submit();
});
});
};
这个问题似乎与时间有关,而不是其他任何问题。在上载同一组20个文件时,有时错误发生在第五、第七、第十五个文件上,或者根本没有
以下是绑定的完整代码:
ko.bindingHandlers.uploader = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var $element = $(element),
options = ko.unwrap(valueAccessor()),
fileUploadConfig,
fileUpload,
doneHandler;
fileUploadConfig = {
dataType: 'json',
type: 'PUT',
url: '/assets', // will be overriden individually after processing
autoUpload: true,
sequentialUploads: true,
dropZone: options.dropzone,
acceptFileTypes: /(\.|\/)(jpe?g|png|mp3|aac|mp4)$/i,
maxFileSize: 250000000
};
fileUploadConfig.add = function add(ev, data) {
if (DEBUG) { console.assert(data.files.length === 1, "expected the add handler to be called with a single file, got " + data.files.length); }
var kind = data.files[0].type.split('/')[0],
file_name = data.files[0].name;
console.log("adding %s", file_name);
viewModel.addAsset(kind).done(function(asset) {
console.log("AJAX call complete, Knockout data model created for file %s", file_name);
data.asset = asset;
data.asset.upload_file_name(file_name);
data.asset.upload_status('waiting');
data.url = asset.resource_path;
}).done(function() {
data.process(function () {
console.log("calling processing plugin for file %s", file_name);
// EXCEPTION OCCURS HERE
return $element.fileupload('process', data);
}).done(function() {
console.log('processing done, submitting %s', file_name);
data.submit();
});
});
};
fileUploadConfig.done = function done(e, data) {
app.services.Asset.refresh(data.asset)
.done(function(asset) {
asset.upload_status('done');
});
};
fileUploadConfig.send = function send(e, data) {
console.log("sending file %s", data.files[0].name);
data.asset.upload_progress(0);
data.asset.upload_status('uploading');
};
fileUploadConfig.progress = function progress(e, data) {
if (data.asset.upload_status() !== 'uploading') {
return;
}
var percentage = parseInt(data.loaded / data.total * 100, 10);
if (percentage >= 100) {
data.asset.upload_status('processing');
data.asset.upload_progress(null);
} else {
data.asset.upload_progress(percentage);
}
};
fileUploadConfig.fail = function fail(e, data) {
console.log("failure file %s", data.files[0].name);
data.asset.upload_status('failed');
app.services.Base._defaultFailureHandler(data.jqXHR);
app.services.Base.failure422Handler(data.jqXHR);
};
console.log("initializing jQ fileUpload");
fileUpload = $element.fileupload(fileUploadConfig);
}
};
控制台调试语句的示例输出如下所示:
在已经成功处理了文件之后,jQuery文件上传突然不被初始化,这对我来说完全没有意义。这是发生异常时的调用堆栈:
如果我在异常时暂停,则转到返回$element时的帧;并在控制台中检查$element.data,我收到
Object {bind: "uploader: {dropzone: $('.upload-manager-overlay')}"}
-jQuery文件上传当然仍然存在
很抱歉,没有提供一个工作小提琴,但我不能提供上传服务器端点需要这项工作
如果有任何提示或进一步的调试建议,我将不胜感激。结果证明我做了一件愚蠢的事:jQuery文件上传被附加到了一个敲除呈现信息面板的一部分。第一个文件成功传输后,此信息面板即被删除
jQuery文件上传与已从DOM分离的DOM元素绑定不好,这一点毫不奇怪。您是否尝试在jQuery.js中的错误消息上设置断点,并查看周围的变量值?也许这能提供线索?