Node.js - 典型的回调问题

时间:2015-06-24 19:45:41

标签: javascript node.js

我在代码中添加了一些注释,以便您可以看到问题所在,基本上......我想在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);
}

3 个答案:

答案 0 :(得分:5)

您必须将代码移动到回调或您从回调中调用的其他函数。回调是异步执行的,因此不是currency 不再定义,而是它未定义尚未并且它不在同一范围内。< / p>

答案 1 :(得分:1)

您应该在回调中使用货币。

db.where('users', {name: user.username}).then(function(result) {
    var currency = result.items[0].currency;
    console.log(currency);
    if (typeof args[2] == 'number' && args[2] <= currency) {
        var betOkay = true;
        console.log("betOkay is " + betOkay);
    }
});

答案 2 :(得分:1)

JavaScript具有功能范围。变量在定义的函数中可用。但JavaScript也有闭包,它允许内部函数访问外部函数中定义的变量(参见JavaScript closures)。

变量 currency 是在您用于回调的匿名函数中定义的。所以它的范围是回调函数。这就是其他地方无法访问的原因。

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

见下文:

var currency; // defined in the scope where it will be used

db.where('users', {name: user.username}).then(function(result) {
    currency = result.items[0].currency; // has access to it via closure
    console.log(currency);
});
console.log("Program gets to this point without error.");
console.log(currency); 
if (typeof args[2] == 'number' && args[2] <= currency) {
    var betOkay = true;
    console.log("betOkay is " + betOkay);
}