2013-03-28 3 views
2

Можно ли возвратить/выключить функцию звонящего i JavaScript?Как выйти из функции вызова в JavaScript?

Мы добавляем методы тестирования в нашу структуру, и мы хотим выйти, если у нас есть ошибка в утверждении.

Учитывая следующий простой пример кода, я хотел бы обменять EXIT_TEST_THAT_CALLED_ME на то, что выйдет (эквивалентно выполнению возврата в тесте) методом Test123.

Assert = function (expectedTrue, comment) { 
    if(! expectedTrue) { 
     Log.Error(comment); 
     EXIT_TEST_THAT_CALLED_ME;  
    } 
} 

Test123 (...) { 

    var inputField = getInputField(".input"); 
    Assert((inputField !== null), "Checking that we found an input field"); 

    inputField.doSomething(); 
    // This row will cause run time error if inputField is null 

} 

То, что я пытался
возвращение - Конечно, не работает, так как он возвращает только из Утверждая метод
arguments.callee.caller.return - ничего не делает
аргументов. callee.caller.return() - Не имеет метода «возврат»

Примечание
Переход на тестовую платформу, которая уже имеет это и где все хорошо, не является вариантом. . :(

+2

Почему вы не исключение? –

+0

@javapirate Вот что я в итоге сделал. Кажется, это лучший способ. Tnx –

ответ

2

Одним из вариантов было бы использовать try\catch\throw

Assert = function (expectedTrue, comment) { 
    if(! expectedTrue) { 
     Log.Error(comment); 
     throw "OOPS"; 
    } 
} 

try{ 
    // function that users Assert 
    Test123 (...) 
} 

catch(err){  
    alert(err); 
    if (err=="OOPS"){ 
    //special handling for a certain exception 
    } 
} 

Используя этот поток, в тот момент, генерируется исключение, оно будет распространяться вверх до тех пор, пока не достигнет блока поймать для вас, чтобы обработать исключение.

Кроме того, исключение не ограничивается строкой. Он может быть целым, логическим или объектным.

+0

Выбрасывание исключения похоже на правильную вещь. благодаря –

1

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

1.Return значение с вашим Assert, а затем сделать return в вызывающей:

Assert = function (expectedTrue, comment) { 
      if(! expectedTrue) { 
       Log.Error(comment); 
       return false;  
      } 
      return true; 
     }  
Test123 (...) { 
     var assertResult = Assert((inputField !== null), "Checking that we found an input field"); 
     if (!assertResult) 
      return; 
     inputField.doSomething(); 
    } 

2.Отправить функцию обратного вызова в ваш Assert:

Assert = function (expectedTrue, comment, success) { 
      if(! expectedTrue) { 
       Log.Error(comment); 
       return;  
      } 
      success(); 
     } 
assertSuccess = function() { 
    inputField.doSomething(); 
} 
Test123 (...) { 
    Assert((inputField !== null), "Checking that we found an input field", assertSuccess); 
} 
+0

Полностью согласен с №1. Что касается № 2, утверждения обычно используются для проверки того, что происходит плохо, говорится, что «не должно произойти».IMHO менее полезно отправить обратный вызов для чего-то, чтобы «делать», когда утверждение терпит неудачу, поскольку утверждения скорее напоминают «все надежда потеряны». – OpherV

+0

Отправка обратного вызова для отказавшего утверждения, не изменит поток и метод 'doSomething()' будет удален. Я тоже предпочитаю # 1, но № 2 по-прежнему является опцией. –

1

Невозможно изменить ход выполнения вашего звонящего, и это по дизайну.

Что вы можете сделать, это:

  • сгенерирует исключение. Он будет пузыриться, пока он не зацепится где-нибудь, быстро выходя из вызывающих.
  • измените вашу тестовую функцию, чтобы сделать условный возврат, что-то вроде if (!assert(…)) return;.
Смежные вопросы