javascript - 将 JQuery Promises 数组转换为数组的 JQuery Promise 的最干净的方法是什么?

标签 javascript jquery coffeescript promise

我遇到了一个数组中有多个 JQuery Promise 的情况

var arrayOfPromises = [ $.Deferred(), $.Deferred(), $.Deferred(), $.Deferred() ]

并且需要把它变成一个数组的 JQuery Promise

var promiseOfArray = someTransform(arrayOfPromises)

在哪里

promiseOfArray.done(function(anArray){
  alert(anArray.join(","));
});

创建带有文本的警报

result1,result2,result3,result4

我目前在 coffeescript 中将 someTransform 定义为

someTransform = (arrayOfPromises) ->
  $.when(arrayOfPromises...).pipe (promises...) ->
    promises

转换为以下 javascript

var someTransform,
  __slice = [].slice;

someTransform = function(arrayOfPromises) {
  return $.when.apply($, arrayOfPromises).pipe(function() {
    var promises;
    promises = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
    return promises;
  });
};

Here is a jsFiddle我正在寻找的结果。

我想知道是否有更好(更短、更清晰)的方法来定义 someTransform 以实现相同的结果?

最佳答案

你可以 apply数组作为 $.when 的参数。

var promiseOfArray = $.when.apply($, arrayOfPromises);

为了让这个用法更清楚,我喜欢在$中添加一个方法:

$.whenall = function(arr) { return $.when.apply($, arr); };

现在您可以:

$.whenall([deferred1, deferred2, ...]).done(...);

更新:默认情况下,done 处理程序将每个结果作为单独的参数传递;您不会得到一系列结果。

由于您需要处理任意数量的 Deferred,您可以使用特殊的隐式 arguments对象循环结果。

$.whenall([d1, d2, ...]).done(function() {
    for (var i = 0; i < arguments.length; i++) {
        // do something with arguments[i]
    }
});

如果您真的只想连接所有 Deferred 的字符串结果,我们可以使用一点数组技巧。 arguments 类似于数组,但不是Array:

$.whenall([d1, d2, ...]).done(function() {
    alert(Array.prototype.join.call(arguments, ','));
});

如果您想将一组结果返回给您的done 回调,我们可以调整whenall to do it :

$.whenall = function(arr) {
    return $.when.apply($, arr).pipe(function() {
        return Array.prototype.slice.call(arguments);
    });
};

关于javascript - 将 JQuery Promises 数组转换为数组的 JQuery Promise 的最干净的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12206885/

相关文章:

javascript - 声明不带 var 关键字的变量

javascript - 打开时有效,但重新加载时崩溃

javascript - 如何在其中包含特定元素的第一个元素之前或之后插入?

jquery - 如何通过 WWW::Mechanize::Firefox 调用 jQuery 或 Angular 函数?

node.js - 为 Node 、coffee 中的 hubot 发出的 GET 请求指定回调

javascript - ASP.NET MVC、IE 11、$(document).ready 和返回导航缓存

javascript - 如何使用 jquery 获取文件输入中删除文件的值?

javascript - 根据背景颜色更改颜色

javascript - 将 coffeescript 函数转换为 javascript

javascript - 使用 JS/Coffeescript 递归连接数组