In the following program, dbGetUser and registerUser are non-blocking (asynchronous) function calls. The idea is to first query some database for a user and then call registerUser with the resulting object. registerUser performs various asynchronous operations and takes a callback (continuation) as argument. On completion, registerUser passes a response object to the callback with a boolean property success to indicate the result of registering the user. Finally, the program should take some action based on whether the user was registered or not.
function callback(user) {
registerUser(user, function(response) {
user.registered = response.success;
});
if (user.registered) {
sendPandaBearTo(user);
} else {
doSomethingElse();
}
}
/* Program starts here */
dbGetUser('Bob', callback);
But there is a major flaw in this piece of code. What is it?
Since registerUser returns immediately, checking the registered property on the user object presents a race condition in the above code (the callback may or may not have been invoked at the time the if-statement is executed). Moving the relevant portion of the code to inside the callback solves the problem:
registerUser(user, function(response) {
user.registered = response.success;
if (user.registered) {
sendPandaBearTo(user);
} else {
doSomethingElse();
}
});