2012-11-01 53 views
1

为什么这段代码返回$ products是空的?如果我在函数内测试$ product,它会显示数据......但一旦完成,我似乎无法获取数据。匿名函数中JS变量的范围是什么

var $products = new Array(); 
connection.query($sql, function(err, rows, fields) { 
    if (err) throw err; 
    for(i=0; i< rows.length; i++) 
    { 
     $products[rows[i].source_identifier] = "xyz"; 
    } 

}); 
connection.end(); 

console.log($products); // Shows empty. 
+4

欢迎来到** async **的美妙世界!你不能那样做。 – SLaks

回答

2

它不回报为空;没有return声明。问题是操作是异步。当您的console.log()调用运行时,查询尚未完成。

将您的console.log()致电里面的表示回拨函数,在for之后循环。 (同时声明“i”为var !!!)

使用涉及回调的API的全部重点是应对操作是异步的事实。如果它们是同步的,那么设计这样的接口会很奇怪。

+0

我的第一个直觉是这是一个异步的问题....我试图把回拨给回拨,但我得到奇怪的数据..你能举一个快速的例子吗?谢谢。 – smorhaim

+0

@smorhaim添加一个'return'什么都不做,因为它只是将它返回到在调用connection.query时建立的异步上下文中称为回调的任何东西。简而言之,您不能在回调之外访问填充的$ products。 – JohnnyHK

+0

@smorhaim,对'connection.query'的调用立即返回(几乎)。结果到达时,您只需保留一个回调函数即可运行。 – acelent