Skip to main content

JavaScript: asynchronous function that resumes to synchronous



I have a large script that is very synchronous.





1) it runs a function like this:







var result = doSomethingSynchronous(myVar);

if (result === 'something') {

doSomethingElse();

}







the doSomethingSynchronous function has a for loop that returns a value on a if statement:







var i = 0; le = someVariable.length;

for (; i < len; i++) {

if (someVariable[i] === 'aString') {

return true;

} else {

doSomethingElse();

}

}







Because the for loop and the processing can be intense, I've replaced the for loop with an iterative queue processing function that runs itself asynchronously using setTimeout after shifting one element from the array. Once it runs asynchronously of course it doesn't return the value and assigns it to the 'result' variable in the first snippet synchronously, and the if statement there always fails. My question is, is there a way to keep this part synchronous? Have the value be assigned to result before the script goes on to the next line? Or do I necessary have to use the observer/mediator pattern or similar to notify that the asynchronous function is completed?





Alternatively I could use a callback, but the actual real code is longer than this one and all depend on synchronicity. So switching var result = doSomethingSynchronous() to asynchronous would have a domino effect on the rest of the synchronous scripts, correct? :-) This sounds like a difficult and error-prone conversion, so I thought I'd ask for advice.





Thanks!


Comments

  1. In order to assign the result to a value, you would need to pass through a callback and call that instead of returning a value, whether or not you're deferring functionality to a timer or not.

    function doSomething(someVariable, callback){
    var i = 0; le = someVariable.length;
    for (; i < len; i++) {
    if (someVariable[i] === 'aString') {
    callback && callback(true);
    break;
    } else {
    setTimeout(function(){ deferredSomething(callback); }, 10);
    }
    }
    }

    function deferredSomething(callback){
    /* code.. */
    callback && callback('something');
    }

    doSomething(myVar, function(result){
    if (result === 'something') {
    doSomethingElse();
    }
    });


    I'll also mention that if you are doing something intense, you should definitely look at web workers so you can offload to a background thread, especially if you're working with just a FireFox add-on. https://developer.mozilla.org/En/Using_web_workers

    ReplyDelete

Post a Comment

Popular posts from this blog

Why is this Javascript much *slower* than its jQuery equivalent?

I have a HTML list of about 500 items and a "filter" box above it. I started by using jQuery to filter the list when I typed a letter (timing code added later): $('#filter').keyup( function() { var jqStart = (new Date).getTime(); var search = $(this).val().toLowerCase(); var $list = $('ul.ablist > li'); $list.each( function() { if ( $(this).text().toLowerCase().indexOf(search) === -1 ) $(this).hide(); else $(this).show(); } ); console.log('Time: ' + ((new Date).getTime() - jqStart)); } ); However, there was a couple of seconds delay after typing each letter (particularly the first letter). So I thought it may be slightly quicker if I used plain Javascript (I read recently that jQuery's each function is particularly slow). Here's my JS equivalent: document.getElementById('filter').addEventListener( 'keyup', function () { var jsStart = (new Date).getTime()...

Is it possible to have IF statement in an Echo statement in PHP

Thanks in advance. I did look at the other questions/answers that were similar and didn't find exactly what I was looking for. I'm trying to do this, am I on the right path? echo " <div id='tabs-".$match."'> <textarea id='".$match."' name='".$match."'>". if ($COLUMN_NAME === $match) { echo $FIELD_WITH_COLUMN_NAME; } else { } ."</textarea> <script type='text/javascript'> CKEDITOR.replace( '".$match."' ); </script> </div>"; I am getting the following error message in the browser: Parse error: syntax error, unexpected T_IF Please let me know if this is the right way to go about nesting an IF statement inside an echo. Thank you.