【问题标题】:Extracting values from an array of Deferreds从延迟数组中提取值
【发布时间】:2012-03-23 20:19:21
【问题描述】:

我有一个 Deferred 对象数组,我试图在它们完成后将其映射到它们的解析值。我想在一切完成后返回数组。

这是我目前所拥有的:

$.when.apply(null, deferredArray)
.pipe(function(){
  return deferredArray;
});

不幸的是,这将返回处于已解决状态的 Deferred 对象数组。 有什么方法可以直接访问已解析的元素?我知道我可以将 .then.pipe 分别链接到已解析的 Deferred 对象数组上,但这不适用于我的目的。

【问题讨论】:

    标签: jquery arrays deferred


    【解决方案1】:

    延迟对象并非旨在返回任何值。您必须在回调中处理结果。

    结果作为参数传递给donefailpipe 回调:

    $.when.apply(null, deferredArray).then(function(){
      // arguments[0] is the result of the first deferred object
      // arguments[1] is the result of the second deferred object
      // ...
    
      // or simple pass it to a function that needs the results:
      someFunction(arguments);
    });
    

    当然,您也可以将该函数设置为回调:

    $.when.apply(null, deferredArray).then(someFunction);
    

    DEMO

    【讨论】:

    • 我明白,但正如我所提到的,这对我的目的并不适用。我正在使用一个 JS 库,我应该在其中传递某个结构(对象数组)。我使用 AJAX 调用来获取对象,所以我需要传递解析值的数组。
    • @JiaweiLi:正如我在对您的回答的评论中所说,即使您可以获得数组,在处理它的那一刻,它也可能不包含任何值。您必须在回调中调用库函数。查看我的更新。
    【解决方案2】:

    这是一个hacky解决方案:

    extractDeferredArray = function(array) {
      var deferred, extract, ret;
      ret = [];
    
      extract = (function() {
        var _i, _len, _results;
        _results = [];
        for (_i = 0, _len = array.length; _i < _len; _i++) {
          deferred = array[_i];
          _results.push(deferred.then(function(value) {
            return ret.push(value);
          }));
        }
        return _results;
      })();
    
      // Make sure our .then methods have completed
      return $.when.apply(null, extract).pipe(function() {
        return ret;
      });
    };
    

    这样做似乎有点尴尬。

    【讨论】:

    • CoffeeScript 在这里应该如何提供帮助?
    • 我通常发现 CoffeeScript 更容易编写代码。将我的解决方案更改为 Javascript,以防人们不知道它。
    • 哦,我什至没有注意到您回答了自己的问题。我只是感到困惑,因为您甚至没有在问题中提到 CoffeeScript。无论如何,您的代码可能无法按预期工作。在extractDeferredArray 返回数组的那一刻,它可能还没有被填充,因为延迟的对象可能还没有被解析。
    • 在我的开场白中,您将使用return extractDeferredArray(deferredArray),而不是return deferredArray。由于$.when.apply(null, deferredArray),所有延迟对象都保证已解决。
    • 好吧,我明白了......无论如何,这不是必需的,arguments 已经包含解析的值。你把事情弄得太复杂了。
    猜你喜欢
    • 2021-04-03
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    相关资源
    最近更新 更多