Javascript Node.js-典型的回调问题

Javascript Node.js-典型的回调问题,javascript,node.js,Javascript,Node.js,我在代码中添加了一些注释,以便您可以看到问题所在,基本上。。。我希望currency在db.where()函数之后“可用”,以便可以在if语句中使用它。这无疑很简单,可以解决,但我很糟糕。谢谢你抽出时间 db.where('users', {name: user.username}).then(function(result) { var currency = result.items[0].currency; console.log(currency); }); console

我在代码中添加了一些注释,以便您可以看到问题所在,基本上。。。我希望currency在db.where()函数之后“可用”,以便可以在if语句中使用它。这无疑很简单,可以解决,但我很糟糕。谢谢你抽出时间

db.where('users', {name: user.username}).then(function(result) {
    var currency = result.items[0].currency;
    console.log(currency);
});
console.log("Program gets to this point without error.");
console.log(currency); // Doesn't work as currency is no longer defined.
if (typeof args[2] == 'number' && args[2] <= currency) {
    var betOkay = true;
    console.log("betOkay is " + betOkay);
}
db.where('users',{name:user.username})。然后(函数(结果){
var currency=result.items[0]。货币;
控制台日志(货币);
});
log(“程序到达这一点时没有错误。”);
console.log(货币);//不起作用,因为不再定义货币。

如果(参数类型[2]='number'&&args[2]您必须将代码移动到回调或从回调调用的另一个函数中。回调是异步执行的,因此不是不再定义
currency
,而是它尚未定义且不在同一范围内。

您应该在回调中使用currency

db.where('users',{name:user.username})。然后(函数(结果){
var currency=result.items[0]。货币;
控制台日志(货币);

if(typeof args[2]=='number'&&args[2]JavaScript具有函数作用域。变量在定义的函数中可用。但是JavaScript还具有闭包,允许内部函数访问外部函数中定义的变量(请参阅)

变量currency是在您用于回调的匿名函数中定义的。因此它的作用域是回调函数。这就是为什么在其他地方无法访问

正如其他答案所表明的那样,您可以通过在回调中包含需要访问currency的代码来实现目标,但您也可以在外部范围中声明变量currency,并在回调中设置它(通过闭包)

见下文:

var currency;//在将使用它的范围中定义
db.where('users',{name:user.username}).then(函数(结果){
currency=result.items[0]。currency;//可以通过闭包访问它
控制台日志(货币);
});
log(“程序到达这一点时没有错误。”);
控制台日志(货币);

如果(typeof args[2]=='number'&&args[2]将您需要在回调函数中执行的工作粘在一起…我将代码放在回调函数中,由于某种原因,它仍然无法通过if语句。为了澄清,args[2]作为数字1提供,我的货币是73。Betok的console.log没有运行。最后执行的是console.log(货币);您应该通过执行一个简单的
console.dir(args);