【问题标题】:jquery: what happens when you pass a deferred object into "then"?jquery:当您将延迟对象传递给“then”时会发生什么?
【发布时间】:2011-09-30 07:18:07
【问题描述】:

我研究 jquery 延迟对象已经有一段时间了,但我被一件事难住了。

“done”、“always”、“then”等方法将在解析延迟对象时应调用的函数作为其参数。

但是我尝试通过将延迟对象传递给“always”方法来链接请求,并且 似乎 也可以工作:

// A is an array of data
var req = ajax(url + "?d=" + A[0]).done(processResults).fail(reportFailure);
for (var i = 1 ; i < A.length ; i++) {
  var tmp = ajax(url + "?d=" + A[i]).done(processResults).fail(reportFailure);
  req.always(tmp);
  req = tmp;
}

但是,它并没有真正起作用。因为当我遵循上面的代码时:

req.always(foobar);

foobar 似乎在某个随机时间被调用,不一定是在处理完数组中的最后一个元素之后。

什么时候用会更好?

// A is an array of data
var req = $.when(ajax(url + "?d=" + A[0]).done(processResults).fail(reportFailure));
for (var i = 1 ; i < A.length ; i++) {
  req = $.when(req, ajax(url + "?d=" + A[i]).done(processResults).fail(reportFailure));
}
req.always(foobar);

上述代码(使用“when”)会导致 ajax 请求一个接一个地发生,还是同时发生?

顺便说一句,我研究了使用“管道”进行链接,但由于范围问题,我认为将“管道”与上述 for 循环一起使用会更难。

另外,为什么原始代码“几乎可以工作”?那里发生了什么?它是否像执行函数一样执行延迟对象,执行此操作时会发生什么?

【问题讨论】:

  • p.s.:我尝试使用 $.when ,它似乎确实有效。但是我仍然不明白为什么以另一种方式“有点”工作。与使用管道相比,这似乎是创建请求链的更好方法——但我不确定这是否是“何时”的使用方式。
  • .pipe() 在将 ajax 调用的结果用于构建另一个 ajax 调用的输入时很有用。在您的情况下,使用 $.when() 合并的并行 ajax 调用看起来更合适。在我的回答中,我向您展示了如何在合并的 Deferred 上使用 .done() 注册单个成功回调
  • pps。使用 $.wait 并没有真正起作用。但是下面“管道”的解决方案似乎确实有效,尽管我必须解决“i”的范围问题

标签: jquery jquery-deferred


【解决方案1】:

你应该建立一个数组并使用javascript apply

//create an array of one deferred per element
var requests =  $.map(A, function(index, a){return= $.ajax(url + "?d=" + a);});
//merge all deferreds into a single one
var mergedRequest = $.when.apply(null, requests);

mergedRequest.done(function(res0, res1, ...){
   //your code goes here
   //if you want results as an array just use arguments
   arguments.length == A.length;
});

编辑: 如果您希望连续拨打电话:

var result = $.ajax(url + "?d=" + A[0]);
for (var i = 1 ; i < A.length ; i++) {
  result = result.pipe(function() {
    return $.ajax(url + "?d=" + a[i]);
  }
}
result.done(processResults).fail(reportFailure);

【讨论】:

  • 问题是,我不希望它们并行化。我希望它们序列化。
  • 第二件事似乎有效——谢谢——尽管我认为变量“i”可能存在范围问题——但这是可以修复的。
猜你喜欢
  • 2023-03-26
  • 2017-06-20
  • 2015-08-15
  • 2012-11-02
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多