here is the scenario:
A simple method with tbh not a whole lot in it.
In fact the entire method is taken by a single if/else block. Regardless of the outcome of both if blocks it is necassary to call a method afterwards.
So obviously that call goes outside the if.
Normally that would be fine.
But in my case the else block contained an inline function used as a callback.
A callback that will occur some undetermined (but very small) amount of time after the if block has exited.
Of course I needed to wait until this callback had been executed before calling the final method.
function DoSomething()
{
if (condition)
{
DoOneThing();
} else {
AsyncronuslyDoAnother(function (result){
DoSomethingWithTheResultWhenTheAsyncCallCompletes();
});
}
DoFinalThing();
}
Now the simple solution in this instance was to move the call to DoFinalThing() to be inside the if block, and also inside the anonymous callback function.
function DoSomething2()
{
if (condition)
{
DoOneThing();
DoFinalThing();
} else {
AsyncronuslyDoAnother(function (result){
DoSomethingWithTheResultWhenTheAsyncCallCompletes();
DoFinalThing();
});
}
}
However in my case the problem only arose in the first place because I simply didn't notice the inline function when I added the call to DoFinalThing() and assumed that it was all just part of the else logic.So additionally I removed the inline function and henceforth declare all such things to be evil!
(ok well not quite, but at least I am more wary now!)
function AsyncCallback(result)
{
DoSomethingWithTheResultWhenTheAsyncCallCompletes();
DoFinalThing();
}
function DoSomething3()
{
if (condition)
{
DoOneThing();
DoFinalThing();
} else {
AsyncronuslyDoAnother(AsyncCallback); //N.B. no parens on AsyncCallback - we are passing a reference to the method not invoking it
}
}
No comments:
Post a Comment