2

XCode has webkit built in, and XCode can issue a JavaScript command and receive a return value. All that is good - except when JavaScript has a callback function like with executeSql.

How do you write a function that doesn't return until the callback has been called?

Do you wrap it in another function maybe?

Phillip Senn
  • 46,771
  • 90
  • 257
  • 373
  • you might want to look into web workers. See http://www.html5rocks.com/en/tutorials/workers/basics/ – markasoftware Mar 12 '13 at 01:52
  • You wrote a game called thermonuclear war, and there is a course at Udacity put on by Google developers that is talking about game development. Just thought you'd be interested. – Phillip Senn Mar 12 '13 at 03:11

2 Answers2

2

There are two solutions - you may either write your entire program in continuation passing style or you may use trampolines to simulates real continuations.

If you want to use continuation passing style then I suggest you first read the following StackOverflow thread: What's the difference between a continuation and a callback?

Continuation passing style can be a pain to write. Fortunately there are JavaScript preprocessors like jwacs (Javascript With Advanced Continuation Support) which ease writing such code: http://chumsley.org/jwacs/

The second option (using trampolining) currently only works in Firefox and Rhino. Sorry XCode. You can read more about trampolining here: Trampolines in Javascript and the Quest for Fewer Nested Callbacks

If it interests you then I've written a small fiber manager for JavaScript that allows you to call asynchronous functions synchronously: https://github.com/aaditmshah/fiber

Community
  • 1
  • 1
Aadit M Shah
  • 72,912
  • 30
  • 168
  • 299
1

May I suggest checking it periodically?

var executeSqlIsDone = false;
executeSql({
        callback: someCallbackFunction();
     });
waitUntilCallbackIsFinished();
//continue processing

function someCallbackFunction()
{
    executeSqlIsDone = true;
}

function waitUntilCallbackIsFinished()
{
     if(executeSqlIsDone === false)
     {
          setTimeout(waitUntilCallbackIsFinished, 100); //some low value
     }
     //else - do nothing. Wait.
}

Also look into

Julia McGuigan
  • 624
  • 1
  • 7
  • 16