从多个延迟中获取结果并传递给函数

Get results from multiple deferred and pass to function

我有一个这样的函数来处理一些数据数组:

function ProcessItems(data){
    var def = $.Deferred();
    var results = [];   
    $.each(data, function(v, k)
    {
        // GetItem(k) returns promise
        results.push(GetItem(k));
    });
    return $.when.apply(null, results);
}

我正在尝试使用 GetItem(k) 函数获取一些项目,然后我想 return 选择数据并将其传递给这样的函数:

// data -> JSON array, results -> array of promises
ProcessItems(data).then( function(results) { return ShowItems(results); } )

并使用以下函数显示它:

function ShowItems(items) {
    // here items have no data, but only a promise objects
    var def = $.Deferred();
    $.each(items, function(v, k)
    {
        alert(k);
    });
    def.resolve();
    return def.promise();
}

我知道我可以从这里的参数中获取我的数据

$.when.apply(null, results).then(function() {
    // arguments[0] etc <= data is here
});

但是如何传递给下一个函数呢?

如您所知,jQuery 的 $.when() 很笨拙,因为它以参数列表而非数组的形式提供数据。因此,您只需要知道如何将 arguments 转换为适当的数组即可。

诀窍是 Array.prototype.slice.call(arguments),或者 [].slice.call(arguments) 如果你愿意的话。

完整:

function ProcessItems(data) {
    var results = $.map(data, function(value, key) {
        return GetItem(key);// or GetItem(value) ?
    });
    return $.when.apply(null, results).then(function() {
        return Array.prototype.slice.call(arguments);//convert arguments list to array
    });
}

function ShowItems(items) {
    //items is an array
    items.forEach(function(value, index) {
        alert(value);
    });
}

ProcessItems(data).then(ShowItems);