可以从JavaScript中返回/退出调用函数吗?
我们正在向我们的框架添加测试方法,如果我们在Assertion上有错误,我们想退出。
鉴于以下简单的示例代码,我想交换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
}
我尝试了什么
return - 当然不起作用,因为它只从Assert方法返回
arguments.callee.caller.return - 什么都没有
arguments.callee.caller.return() - 没有方法'return'
注意
更改为已经具有此功能且一切都很好的测试框架不是一种选择。 :(
答案 0 :(得分: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
}
}
使用此流程,在抛出异常的那一刻,它将向上传播,直到它到达catch块以便您处理异常。
此外,异常不限于字符串。它可以是整数,布尔值或对象。
答案 1 :(得分:1)
我认为不可能从函数中退出调用者。我建议一些解决方法:
1.使用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);
}
答案 2 :(得分:1)
无法改变调用者的执行流程,这是设计使然。
你能做的是:
if (!assert(…)) return;
。