我正在查询我的sqlite3数据库以检查用户详细信息,然后在查询完成后调用回调方法。在回调中我可以很好地访问数据,但是当我想复制该数据时,即将值分配给会话变量或全局实例时,一旦回调完成,它就变为未定义。我的问题是,我该如何避免这种情况?
var custFuncs = require( '../functions' );
var arrRow = []
// process log in.
router.post( '/login', upload.array(), function( req, res )
{
custFuncs.checkAuthDetails( req.body.uname, req.body.pass, function ( row )
{
//req.session.userID = row.id;
arrRow.push( row.id );
console.log( arrRow ); // PRINTS OUT [ 1 ] HERE
} );
console.log( arrRow ); // PRINTS OUT [] HERE
res.redirect( '/' );
});
然后在functions.js中:
function checkAuthDetails( userName, pass, callback )
{
var hashedPass = encrypt( pass );
db.serialize( function()
{
db.get( "SELECT id, uname, pass FROM user WHERE uname = ?", [userName], function( err, row )
{
if( (row.id > 0) && (row.pass == hashedPass) )
{
callback( row );
}
});
});
}
答案 0 :(得分:0)
它之所以这样做是因为它们是异步调用。您应该看到打印空数组的那个在用户ID为的之前被调用。这是因为它首先到达了这个。当您致电<StackPanel>
<!-- BINDING NOT WORKING -->
<ContentControl Content="{StaticResource panel}" />
<!-- BINDING WORKING HERE -->
<CheckBox x:Name="chkDefaultValue" Content="Default Value"
IsChecked="{Binding ElementName=txtDefaultValue, Path=Text.Length, Mode=OneWay}" />
<TextBox x:Name="txtDefaultValue"
Text="{Binding DefaultValue, Mode=TwoWay, ValidatesOnDataErrors=True}"
IsEnabled="{Binding ElementName=chkDefaultValue, Path=IsChecked}" />
</StackPanel>
时,它会直接转到该功能的下一行代码,而不是等待costFuncs.checkAuthDetails
的回调被调用。
您想要对数据做的任何事情都必须在回调后完成。