Выходить из функции с $ .each

Я использую функцию $ .each jQuery, чтобы пробегать один JSON, и данное некое утверждение я хочу показать один alert(), выходить $.each и функции, которая это содержит, я знаю, что с return false; он вытекает из функции $.each, но продолжи с выполнением функции.

Пример

function guardarCuestionario() {
    var preguntas = JSON.parse('cadena de texto con formato JSON');

     $.each(preguntas, function () {
          value = $("input:radio[name ='" + this.ID + "']:checked").val();

          if (this.EsObligatoria && value === undefined) { 
              alert('Necesitas seleccionar una respuesta para todas las preguntas que no son opcionales');
              return false; // solamente se sale del $.each pero no de la funcion
          }
          /*
              Mas código 
          */
     });
     console.log('No quiero que continúe hasta aquí si (this.EsObligatoria && value === undefined) se cumple!!!');
     /*
         Mas código 
     */
}

Я знаю, что я могу добиваться того, что я хочу распределяя стоимость во флаг знать, в каком-то моменте вхожу ли я в условие и проверять ее в конце концов, но хочу знать, существует ли какой-то способ выходить $.each и функции, которая содержит ее в решении.

12
задан 08.12.2015, 17:40
3 ответа

Возможная одна soluciГіn состоит в том, чтобы использовать исключения. cГіdigo serГ - в простой:

  • Завертывает призыв к ней funciГіn внутри одного try с одним catch vacГ - или.
  • , Когда ты прибудешь в нее condiciГіn из остановки, копья одна excepciГіn с throw.

Например, в этой demostraciГіn повторяет array 6 элементов, она condiciГіn остановки дело в том, что sГіlo они явились двумя из них, и despuГ©s этого он нарушает в конце концов без того, чтобы оно являлось сообщением "я не хочу, чтобы он продолжил даже aquГ-!" (он смотрит консоль языка сценариев JavaScript, чтобы видеть результаты):

function guardarCuestionario() {
    var preguntas = JSON.parse('[1,2,3,4,5,6]');
    $.each(preguntas, function(i, e) {
        if (i == 2) {
            throw "Cualquier Cosa";
        }
        console.log(e);
    });
    console.log('No quiero que continúe hasta aquí!');
}

try {
    guardarCuestionario();
} catch (e) { }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

И примененный к тебе cГіdigo в особенности verГ - в asГ-:

function guardarCuestionario() {
    var preguntas = JSON.parse('cadena de texto con formato JSON');

    $.each(preguntas, function () {
        value = $("input:radio[name ='" + this.ID + "']:checked").val();

        if (this.EsObligatoria && value === undefined) { 
            alert('Necesitas seleccionar una respuesta para todas las preguntas que no son opcionales');
            throw "error"; // salta al catch
        }
        /*
        Mas código 
        */
    });
    console.log('No quiero que continúe hasta aquí si (this.EsObligatoria && value === undefined) se cumple!!!');
    /*
    Mas código 
    */ 
}

try {
    guardarCuestionario();
} catch(e) { }
7
ответ дан 24.11.2019, 15:07
  • 1
    Очень изобретательная soluci и # 243; n, хотя он не будет засолен funci и # 243; n, только он вытекает из блока delimitador, но даже схвати и # 237; очень хороший ответ –  Enrique Zavaleta 08.12.2015, 18:39
  • 2
    Если ты хочешь, чтобы он вытек из funci и # 243; n полностью, двинь try и catch в место, откуда ее зовут funci и # 243; n и mant и # 233; n throw внутри funci и # 243; n –  Alvaro Montoro♦ 08.12.2015, 18:41
  • 3
    Если, в самом деле, хотя только он был бы должен делать что-то как if(e !== 'errorDefinidoPorMi') throw e; –  Enrique Zavaleta 08.12.2015, 18:49
  • 4
    @AlvaroMontoro modifiqu и # 233; твой soluci и # 243; n, чтобы делать 100 % правильный seg и # 250; n комментарии. –  Carlos Muñoz 08.12.2015, 19:46
  • 5
    #161; Внимание! Использовать исключения для контроля разгрузки не считается хорошим pr и # 225; ctica в общем; пробуй искать всегда альтернативу или, если ты нуждаешься в том, чтобы использовать эту систему, пытайся герметизировать в корпусе это в каком-то construcci и # 243; n м и # 225; s высокий уровень, который прятал бы управление исключений. –  Darkhogg 09.12.2015, 13:20

Нет родного способа этого добиваться. Функция each не принадлежит синтаксису языка сценариев JavaScript, следовательно, Ваше использование - то же самое, что тот любой другой функции.

Существуют несколько техник, чтобы добиваться того, что ты желаешь. Одна из них - использование исключения StopIterationException или сходный, что puedees бросать, когда ты примешь решение остановить повторение. Лично он мне не нравится.

Другой выбор состоит в том, чтобы использовать Array.prototype.some вместо each jQuery. Как только ты найдешь условие безработицы (где ты поместил бы один break) ты будешь должен использовать один return true, то, что показывает условие безработицы для some. Стоимость возврата some ты будешь должен проверять это, чтобы знать, ли убежишь ты от функции.

function guardarCuestionario () { var ты спрашиваешь = JSON.parse ('цепь текста с форматом JSON');

 var escapa = preguntas.some(function () {
      value = $("input:radio[name ='" + this.ID + "']:checked").val();

      if (this.EsObligatoria && value === undefined) { 
          alert('Necesitas seleccionar una respuesta para todas las preguntas que no son opcionales');
          return true; // regresa true para indicar que debe escapar de la función
      }
      /*
          Mas código 
      */
 });
 if (escapa) {
     return;
 }
 console.log('No quiero que continúe hasta aquí si (this.EsObligatoria && value === undefined) se cumple!!!');
 /*
     Mas código 
 */

}

Очевидно, продолжают использовать вспомогательную переменную в обоих случаях (стоимость возврата some или разбитое исключение). Если то, что ты желаешь, будет состоять в том, чтобы иметь более простой код, вероятно тебе будет следовать использовать один for классик.

6
ответ дан 24.11.2019, 15:07
  • 1
    Если, for существо и # 237; в soluci и # 243; n простой, хотя я предпочитаю использовать $.each из-за Вашей простоты и читабельности, которую он предлагает –  Enrique Zavaleta 08.12.2015, 18:36
  • 2
    @EnriqueZavaleta Вещь состоит в том, что эта читабельность разрушается полностью, если ты начинаешь использовать вычурные способы вытекать из цикла. Adem и # 225; s, each предлагает, что ты хочешь реализовать operaci и # 243; n для каждых элемент, что-то, чему противоречит твой intenci и # 243; n ломания цикла ранней формы. –  Darkhogg 09.12.2015, 14:49
  • 3
    @Marcelo, как я сказал ему в @JuanDavid, как я написал в последнем параграфе, с начала знал, что было возможно делать с флагом, и так я это сделал, только он хотел знать, существует ли какой-то способ выходить из $.each и из funci и # 243; n, что содержит ее в решении . Сейчас, из-за этого each, он не значит, что хочет сделать X вещь для каждый элемент, скорее я хочу сделать X вещь из-за каждый элемент, это ломания цикла он не имеет ничего общего, из-за чего-то существуют способы выходить из each / таких foreach как break в C # –  Enrique Zavaleta 09.12.2015, 16:34

Я не понимаю, который является проблемой? Если ты вытекаешь из $ .each с return, именно только ты использовал такую переменную как параметр вывода... пример:

function guardarCuestionario() {
   //... code code code
   var exit = false;
   $.each(preguntas, function () {

       if (this.EsObligatoria && value === undefined) { 
          exit = true;
          return false;
       }
       //... code code code
   });

   exit && return; //si no te gusta así, estas libre de utilizar un if jeje
   //... code code code
}

Исключения хорошие, но не ответ для всего, и меньше для этого случая ;)

4
ответ дан 24.11.2019, 15:07
  • 1
    нет никакой проблемы, только он хотел знать, был ли способ делать X вещь, если ты читаешь последний параграф, ты можешь видеть, что я определяю с начала, что было возможно делать с флагом , и так я это сделал, только хотел знать, существует ли какой-то способ выходить из $ .each и из funci и # 243; n, что содержит ее в решении . –  Enrique Zavaleta 08.12.2015, 22:23
  • 2
    Ahh, если, я понял despu и # 233; s, что уже hab и # 237; в место комментарий jajaja, Если не, что видят ужасно примеры манипулируя исключениями. PD: тебе не нравится программировать в ingl и # 233; s? –  jdnichollsc 09.12.2015, 05:54
  • 3
    Если я это делаю, действительно совсем я c и # 243; я говорю est и # 225; в ingl и # 233; s, из-за того, чего кто-то м и # 225; s другой части мира ограда, которую он нужно изменять, кроме того, что есть вещи, которым они помогают, деталь состоит в том, что это stackoverflow в espa и # 241; ol. Схвати и # 237; что старался быть м и # 225; s возможный правоверный в цель сайта ^ _ ^ –  Enrique Zavaleta 09.12.2015, 07:36