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

时间:2015-08-12 10:17:57

标签: javascript asynchronous deferred

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

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)函数获取一些项目,然后我想返回所选数据并将其传递给这样的函数:

// 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
});

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

1 个答案:

答案 0 :(得分:1)

正如您所知,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);