使用promises链接Jquery延迟对象

时间:2015-03-05 18:23:41

标签: jquery

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() ... )中从未调用过的语句。有人能指出我正确的方向吗?

1 个答案:

答案 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处理。您可能希望您的微调器停止始终,而不仅仅是整体成功。