简体   繁体   中英

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.

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM