当'each`结束时,开始另一个'each`

时间:2014-03-18 17:02:55

标签: jquery

我正在尝试做下一件事:当第一部分完成时(包括从服务器获取详细信息的函数AccountClicked),启动第二部分。

我该怎么办呢?

    // first part
    $('#accountsTable li input').each(function () {
        isGetLastSearchOperation = true;
        var accountId = $(this).attr('id');
        if ($.inArray(accountId, LastSearchedAccountsIds) > -1) {
            AreClickedButtonsEnable = true;
            $(this).attr('checked', true);
            AccountClicked(this);
        }
        // uncheck the other goals
        else {
            $(this).attr('checked', false);
        }
    });

    // second part
    $('#commercialGoalsTable li input').each(function () {
        isGetLastSearchOperation = true;
        var goalId = $(this).attr('id');
        if ($.inArray(goalId, LastSearchedGoalsIds) > -1) {
            AreClickedButtonsEnable = true;
            $(this).attr('checked', true);
            //CommercialGoalClicked(this);
        }
        // uncheck the other goals
        else {
            $(this).attr('checked', false);
        }
    });

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:3)

最好的解决方案可能是更改代码,以便发送一个ajax请求。

由于AccountClicked()使用ajax并且是异步的,我首先会更改该函数以返回promise对象,然后等待所有的promise都像这样解决:

var promises = [];

// first part
$('#accountsTable li input').each(function () {
    isGetLastSearchOperation = true;
    var accountId = $(this).attr('id');
    if ($.inArray(accountId, LastSearchedAccountsIds) > -1) {
        AreClickedButtonsEnable = true;
        $(this).attr('checked', true);
        promises.push(AccountClicked(this));
    }
    // uncheck the other goals
    else {
        $(this).attr('checked', false);
    }
});

$.when.apply(null, promises).done(function () {

    // second part
    $('#commercialGoalsTable li input').each(function () {
        isGetLastSearchOperation = true;
        var goalId = $(this).attr('id');
        if ($.inArray(goalId, LastSearchedGoalsIds) > -1) {
            AreClickedButtonsEnable = true;
            $(this).attr('checked', true);
            //CommercialGoalClicked(this);
        }
        // uncheck the other goals
        else {
            $(this).attr('checked', false);
        }
    });

});

从函数返回promise的几个简单选项:

function AccountClicked() {
    return $.ajax({
        // ...
    });
}

function AccountClicked() {
    var def = $.Deferred();

    $.ajax({
        // ...
    }).done(function() {
        def.resolve();
    });

    return def.promise();
}

答案 1 :(得分:0)

你可以在第一个每个循环的末尾添加一个if语句,找到元素的数量,当它达到那个高数字时,开始下一个循环。

// first part
var numElem = $('#accountsTable li input').length;
$('#accountsTable li input').each(function (e) {//Notice the 'e' in this function for your index number
    isGetLastSearchOperation = true;
    var accountId = $(this).attr('id');
    if ($.inArray(accountId, LastSearchedAccountsIds) > -1) {
        AreClickedButtonsEnable = true;
        $(this).attr('checked', true);
        AccountClicked(this);
    }
    // uncheck the other goals
    else {
        $(this).attr('checked', false);
    }
    if(e>=numElem-1){
            // second part
        $('#commercialGoalsTable li input').each(function () {
            isGetLastSearchOperation = true;
            var goalId = $(this).attr('id');
            if ($.inArray(goalId, LastSearchedGoalsIds) > -1) {
                AreClickedButtonsEnable = true;
                $(this).attr('checked', true);
                //CommercialGoalClicked(this);
            }
            // uncheck the other goals
            else {
                $(this).attr('checked', false);
            }
        });
    }
});

编辑::忘记零位,编辑if语句来处理。

这是一个例子http://jsfiddle.net/L4asQ/

的小提琴