【问题标题】:passing javascript scope to function将javascript范围传递给函数
【发布时间】:2014-05-03 16:07:57
【问题描述】:

我正在使用 jquery-file-upload 插件上传多个文件,并希望将随后的所有 ajax 请求(此处未显示)添加到异步库中的队列中(主要是因为 iPhone 上的 Safari 似乎没有可以很好地处理很多请求,所以我认为一个一个地喂它们应该会更好)。因此,我定义了 fileupload 插件的 add 事件:

return $('#fileupload').fileupload({
  type: 'POST',
  add: function(e, data) {
    q.push(data, function (err) {
      if (err) {
        console.log('failed processing file '+data.guid+': '+err);
        return(false);
      }
    });
  }
});

那么队列定义如下:

var q = async.queue(function (data, callback) {
  var $this = $(this); // needed for triggering jquery-file-upload process event
  data.process(function () {
    return $this.fileupload('process', data);
  }).done(function () {
  return data.submit();
  callback();
}, 1);

然而,当我运行这个时,我得到了错误:cannot call methods on fileupload before initialization;试图调用方法“进程”

我想这意味着我尝试通过传递数据对象来保留文件上传的范围是不成功的。在我添加 async.queue 之前,最后一位是在 add 事件的定义中定义的,它工作正常。

我一直在尝试阅读 javascript 函数,但到目前为止我还没有弄清楚这一点。如有任何指示,我将不胜感激。

谢谢!

【问题讨论】:

  • 您的异步队列是如何处理的?我看到了定义,但没有看到它被调用。
  • 据我了解,一旦将任务推送到队列中,异步库就会开始处理它 (github.com/caolan/async#queue)。在项目的另一部分中,这部分实际上对我有用。

标签: javascript jquery jquery-plugins scope


【解决方案1】:

如果不深入研究文件上传的内部结构或有一个例子可以解决这个问题,这真的很难回答,但我认为你应该能够通过一些小的调整来完成这个任务。首先,进行@wachme 建议的更改,因为这是一个问题。其次,将上传对象传递给您的队列:

return $('#fileupload').fileupload({
  type: 'POST',
  add: function(e, data) {
    var params = { uploader: $(this), data: data };
    q.push(params, function (err) {
      if (err) {
        console.log('failed processing file '+data.guid+': '+err);
        return(false);
      }
    });
  }
});

然后,在您的处理中使用该参数:

var q = async.queue(function (params, callback) {
  params.data.process(function () {
    return params.uploader.fileupload('process', params.data);
  }).done(function () {
  callback();
  return params.data.submit();
}, 1);

【讨论】:

  • 哦,对了 :) 是的,这似乎有效。之前当我尝试将 $(this) 传递给队列时,我是如此接近,但我不知道如何访问数据对象。所以我必须通过两个 :) 谢谢 Rob!
【解决方案2】:

注意callback 永远不会被调用,因为它在return 语句之后,修复:

var q = async.queue(function (data, callback) {
  var $this = $(this); // needed for triggering jquery-file-upload process event
  data.process(function () {
    return $this.fileupload('process', data);
  }).done(function () {
  callback();
  return data.submit();
}, 1);

【讨论】:

  • 这绝对是个问题,但听起来他们遇到的问题更多的是这条线$this.fileupload('process', data);
  • 你是对的,但实际上该部分尚未执行,因为在 data.process 部分停止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 2018-06-26
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
相关资源
最近更新 更多