Andrew Garcia
Andrew Garcia

Reputation: 307

Understanding Javascript Scope Trouble

I have the following code in my Node.js project:

var response;

if (theInput == 1) {
    models.User.find({
        usersNumber: usersNumber,
        active: true
    }, function (err, user_data) {
        response = "Number is 1";
    });
} else if (theInput == 2) {
    response = "Number is 2";
} else {
    response = "Number is n/a";
}
return response;

I am having a hard time setting response when theInput = 1. Response is undefined when it gets returned. I don't want to set it outside of the model.find function, because my actual response text (in my real code) is based on some of that data.

Upvotes: 3

Views: 38

Answers (1)

lyjackal
lyjackal

Reputation: 3984

response is undefined because it is set asynchronously. Because the processing of inputs is asynchronous (based on callbacks instead of returns). Your function must take a callback rather than return a value. It's also normal practice in node to use the first parameter of a callback for errors, and the second for a return value:

function giveResponseForInput(theInput, callback) {
  if (theInput == 1) {
    models.User.find({
      usersNumber: usersNumber,
      active: true
    }, function(err, user_data) {
      if (err) {
        callback(err)
      } else {
        callback(null, "Number is 1");
    });
  } else if (theInput == 2) {
    callback(null, "Number is 2");
  } else {
    callback (null, "Number is n/a");
  }
}

var returnValue = giveResponseForInput(1, function(err, value) {
     console.log("callback value should be \"Number is 1\" unless the database had an error:", err ? err, value);
});

console.log("return value should be undefined", returnValue);

Upvotes: 4

Related Questions