2015-10-16 59 views
1

我想從一個事件處理函數提前返回如果滿足特定條件(如果選擇了id已經在我的問題列表。)如何退出each()循環並儘早從外部函數返回?

但是我沒有看到,我所期望的結果。

當條件滿足時,我得到「我應該回來」的信息,但我也得到了「我還在這裏嗎?」信息。這仍然允許其餘的代碼在這個函數中執行。

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... 
}); 
+2

使用'return false;'來突破'each'。 – Tushar

+2

只返回'.each',它不會突破點擊事件處理程序。 – Stryner

+0

在你返回false之前,在你的'each'循環中切換一個標誌值,然後檢查該標誌的值,以決定是繼續執行其餘的函數還是在該點返回'return'。 – CBroe

回答

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... 
}); 
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... 
      } 
}); 
0

你必須使用return false跳出$.each循環。但是,這隻會跳出循環回調,控制權將返回到處理函數click

如果您希望儘早從該函數返回,那麼您需要在click處理程序中使用另一個return語句。