如何退出each()循环并从外部函数提前返回?

时间:2015-10-16 17:21:39

标签: javascript jquery

如果满足某个条件,我会尝试从事件处理函数中提前返回(如果所选的id已经在我的问题列表中。)

但是我没有看到我期望的结果。

当条件满足时,我得到“我应该回复”的消息,但我也得到了“我还在这儿吗?”信息。这仍然允许其余代码在此函数中执行。

my.test.on('click', '.question-tagging .add-question-type', function() {
            var questionIds = getSelectedQuestionIds();

            console.log("questionIDs = " + questionIds);
            var currentQuestions = $.each($('.question-list .question-item'), function () {                    
                console.log("Question ID = " + $(this).find('.remove-tag').data('questionid'));
                if (questionIds == $(this).find('.remove-tag').data('questionid'))
                {
                    console.log("I should return");
                    return;
                }                    
            });

            console.log("did i still go here?");

            // more code...
});

3 个答案:

答案 0 :(得分:1)

如您所见,从each()返回,并非从click处理程序返回。如果您放弃each()进行简单的for循环,则可以获得所需内容:

my.test.on('click', '.question-tagging .add-question-type', function() {
    var questionIds = getSelectedQuestionIds();

    console.log("questionIDs = " + questionIds);
    var currentQuestions = $('.question-list .question-item');

    for ( var i = 0; i < currentQuestions.length; ++i )
    {
        var q = $(currentQuestions[i]);

        console.log("Question ID = " + q.find('.remove-tag').data('questionid'));
        if (questionIds == q.find('.remove-tag').data('questionid'))
        {
            console.log("I should return");
            return;
        }                    
    }

    console.log("did i still go here?");

    // more code...
});

答案 1 :(得分:0)

return只会停止执行它所执行的功能。在你的情况下,它会停止执行循环,但不会停止外部点击处理功能。您可以使用布尔标志来确定是否应继续使用外部函数,如下所示:

my.test.on('click', '.question-tagging .add-question-type', function() {
            var questionIds = getSelectedQuestionIds();

            console.log("questionIDs = " + questionIds);

            var shouldContinue = true; //set up a flag

            var currentQuestions = $.each($('.question-list .question-item'), function () {                    
                console.log("Question ID = " + $(this).find('.remove-tag').data('questionid'));
                if (questionIds == $(this).find('.remove-tag').data('questionid'))
                {
                    console.log("I should return");
                    shouldContinue = false; //flip the flag to false
                    return;
                }                    
            });


            if( shouldContinue ) //only continue if condition wasn't met
            {
                console.log("did i still go here?");

                // more code...
             }
});

答案 2 :(得分:0)

您必须使用return false来突破$.each循环。但是,这只会中断循环回调,控件将返回到click处理程序函数。

如果您希望早日从该函数返回,则需要return处理程序中的另一个click语句。