function addAccountData(data) {
var queryResults = data.d.query.PrimaryQueryResult.RelevantResults.Table.Rows.results;
var key;
var displayProps = decodeURIComponent(getQueryStringParameter("qProps")).split(",");
var keyIndex;
var resultIndexes = [];
for (var i = 0; i < queryResults[0].Cells.results.length; i++) {
key = queryResults[0].Cells.results[i].Key;
keyIndex = displayProps.indexOf(key);
if (keyIndex > -1) {
resultIndexes.push(i);
}
}
var promises = [];
for (var h = 0; h < queryResults.length; h++) {
var cellValues = [];
for (var i = 0; i < resultIndexes.length; i++) {
cellValues.push(queryResults[h].Cells.results[resultIndexes[i]].Value);
}
// getAccountInfo(cellValues);
var deferred = $.Deferred();
//add data from SharePoint Accounts list
if (cellValues[4] != null) {
$.when(getAccountInfo(cellValues)).done(function (data) {
tempResults.push(data);
deferred.resolve(tempResults);
});
}
promises.push(deferred);
}
$.when.apply($,promises).done(function() {
alert('yes');
spinner.stop();
},
function(e) {
console.log("My ajax failed");
});
}
我的jquery代码中的这个函数使用延迟对象和promises来解析异步函数。定义了一组promise,并使用.when
和.apply
传递数组。但是,在为每个promise调用deferred.resolve之后,它不会回调$.when.apply($,promises).done(function() ... )
中从未调用过的语句。有人能指出我正确的方向吗?
答案 0 :(得分:1)
我只能怀疑getAccountInfo()
已经返回一个promise(很可能是一个jQuery XHR对象)。
这意味着您不需要自己的延迟基础架构,只需直接使用jqXhr对象即可。
我已经重写了你的代码,为了它的乐趣而没有任何明确的循环。
function addAccountData(data) {
var table = data.d.query.PrimaryQueryResult.RelevantResults.Table;
var displayProps = decodeURIComponent(getQueryStringParameter("qProps")).split(",");
var requests = table.Rows.results.map(function (row) {
// find Cells whose .Key is in displayProps and get their .Value
return row.Cells.results.filter(function (cell) {
return displayProps.indexOf(cell.Key) > -1;
}).map(function (cell) {
return cell.Value;
});
}).filter(function (cellValues) {
return cellValues[4] !== null;
}).map(getAccountInfo);
$.when.apply($, requests).always(function () {
spinner.stop();
}).fail(function(e) {
console.log("Ajax failed");
});
}
这会将您的行从queryResults
映射到Cell值数组,并将它们映射到getAccountInfo()
(我假设它返回单独的jqXhr对象)。
因此,它有效地将您的行映射到Ajax请求承诺,这些承诺由$.when
处理。您可能希望您的微调器停止始终,而不仅仅是整体成功。