2016-08-29 65 views
1

我是新来的异步编程。最近我发现了一个我不太了解的案例。在这个例子中:在readFile中访问外部范围变量

var username = "abc"; 
fs.readFile(filePath, { encoding: 'utf-8' }, function (err, oldUsername) { 
    console.log(username); // Print xyz 
    if (username == oldUsername) 
     // do something, since username is now 'xyz', result failed! 
}); 
username = "xyz"; 

我想比较oldUsername我的文件到用户名(ABC),但在控制台打印“XYZ”这样的结果失败了。

如何获得未修改的值用户名

+1

更改回调里面的用户名似乎是你孤独的选择。或者创建一个tmp变量来保存你的值 – mfrachet

+0

@Skahrz这让我停留了半个小时,你刚刚为我指出了这一点。我只是在回调中更改用户名。似乎没有更好的选择。 – NewJedi

回答

0

您必须记住,该回调函数中的所有代码,直到该代码中的所有其他代码运行之后才会真正运行。

你只是在那里定义函数,而不是执行它。您将它作为参数传递给另一个函数(readFile),以便在它完成异步I/O时调用它。

我想这就好比把一个返回地址放在一个信封上,直到信封上的主要地址被处理之后,这并不重要。

所以你最终在那里分配一个不同的值,在console.log被执行之前。

更多信息就在那里,例如:

事件循环模型的一个非常有趣的属性是JavaScript的,不像很多其他语言,不会阻塞的。处理I/O通常是通过事件和回调来执行的,所以当应用程序等待IndexedDB查询返回或XHR请求返回时,它仍然可以处理其他事情,如用户输入。 [1]

祝你好运! :)

+1

尽管我已经找到了异步,但这仍然非常有帮助。 – NewJedi