2015-06-04 68 views

回答

6

超级约异步:)

这是怎么回事经典初学者的错误:

var name; // FIRST you declare the name variable 

schema.findone({name : 'Bob'} , function(er , db){ // SECOND you launch a request to the DB 
    name = db; // FOURTH name is populated. 
    console.log(db); 
}); 

console.log(name); // !! THIRD !! you log name - it's empty 

你应该做的:

schema.findone({name : 'Bob'} , function(er , db){ 
    doSomethingElse(db); 
}); 

function doSomethingElse(name){ 
    console.log(name); // It's defined. 
} 

你souldn't甚至声明一个全局变量,如这是一个不好的做法。 只要数据可用,将它传递给另一个函数并对其执行一些操作。所以你不会污染你的全球范围。

编辑:既然你绝对要出于某种原因一个全局变量,那么这样做:

var name; 

schema.findone({name : 'Bob'} , function(er , db){ 
    name = db; 
    console.log(name); // works fine 
    doSomethingElse(); 
}); 

console.log(name); // name is empty here, because the DB request is still in progress at this stage 

function doSomethingElse(){ 
    console.log(name); // Tadaaaa! It's a global variable and is defined! 
} 
+0

我想在全局变量设置分贝处理一些别的地方! –

+0

就是这样。 'name'是一个全局变量,不是吗? –

+0

问题是Node.JS是异步的。您不能在全局设置名称,并且直接在db查询回调之外直接控制日志。 – throrin19