我有多个Javascript函数可以调用REST API。偶尔可以在当前会话已过期的情况下进行调用,并且API会返回错误。而不是让每个处理错误并重新验证它似乎更好的是有一个错误处理功能,但为此我需要能够再次触发原始调用。
下面是一般概念的一些伪代码......它假设唯一可能发生的错误是超时。
function responseHandler(args)
{
return function(result)
{
if(result.sessionExpired)
{
// re-authenticate, if all good then call the original function again
reauth(function(err)
{
if(err)
return;
args.callee.apply(null, args);
});
}
else
{
// call the success callback
args[args.length - 1](result);
}
}
}
function doSomething(arg1, arg2, success)
{
makeCallout(arg1, arg2, responseHandler(arguments));
}
function doSomethingElse(arg1, arg2, arg3, success)
{
makeCallout(arg1, arg2, arg3, responseHandler(arguments));
}
在我看来,这肯定会有一些代码味道......显然这些需要某种检查以确保它不会陷入一个递归循环中。 那么是否有一种更清洁的方式来实现我错过的同样的事情?
我可以尝试在每个请求之前检查会话,但这会使所发出的标注数量增加一倍,这在这种情况下是不可行的。
更新版本
将success
参数拆分为命名参数有助于清理,我意识到我也可以跳过arguments.callee
的使用。
function responseHandler(cb, args, success)
{
return function(result)
{
if(result.sessionExpired)
{
// re-authenticate, if all good then call the original function again
reauth(function(err)
{
if(err)
return;
cb.apply(null, args);
});
}
else
{
// call the success callback
success(result);
}
}
}
function doSomething(arg1, arg2, success)
{
makeCallout(arg1, arg2, responseHandler(doSomething, arguments, success));
}
function doSomethingElse(arg1, arg2, arg3, success)
{
makeCallout(arg1, arg2, arg3, responseHandler(doSomethingElse, arguments, success));
}