从多个延迟中获取结果并传递给函数
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);
我有一个这样的函数来处理一些数据数组:
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);