Javascript jQuery文件上载:调试添加回调中的间歇性“未初始化”错误

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.

我正在使用jQuery文件上传和KnockoutJS构建一个资产管理器。问题是,当我上传一组文件时,我会在看似随机的时间收到异常

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中的错误消息上设置断点,并查看周围的变量值?也许这能提供线索?