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

Slow Android emulator

I have a 2.67 GHz Celeron processor, 1.21 GB of RAM on a x86 Windows XP Professional machine. My understanding is that the Android emulator should start fairly quickly on such a machine, but for me it does not. I have followed all instructions in setting up the IDE, SDKs, JDKs and such and have had some success in staring the emulator quickly but is very particulary. How can I, if possible, fix this problem?

CCNA 1 Final Exam 2011 latest (hot hot hot)

  Hi! I have been posted content of ccna1 final exam (latest and only question.) I will post the answer and insert image on sunday. If you care, please subscribe your email an become a first person have full test content. Subcribe now  Some question  have not content because this question have images content. So that can you wait for me? SUNDAY 1. A user sees the command prompt: Router(config-if)# . What task can be performed at this mode? Reload the device. Perform basic tests. Configure individual interfaces. Configure individual terminal lines. 2. Refer to the exhibit. Host A attempts to establish a TCP/IP session with host C. During this attempt, a frame was captured with the source MAC address 0050.7320.D632 and the destination MAC address 0030.8517.44C4. The packet inside the captured frame has an IP source address 192.168.7.5, and the destination IP address is 192.168.219.24. At which point in the network was this packet captured? leaving host A leaving ATL leaving...