2011-07-19 29 views
0

我在一个项目中使用了persistence.js,我在将查询结果推送到一个数组中时遇到了一些问题。persistence.js将结果项推送到一个数组

// setup the region list array 
var regionList = []; 

// ping the database and grab all of the regions 
var regions = Region.all().order('name'); 

// for each result, push the "display name" to the regions list array 
regions.list(null, function(results) { 
    results.forEach(function(r) { 
     regionList.push(r.displayName); 
    }); 
}); 

// alert the regions list array 
alert(regionList); 

“警戒”产生绝对没问题,但是当我尝试了“regions.forEach”中提醒......我得到的结果。看起来阵列的范围没有被维护,但我不确定。根据我的理解,如果我在函数之外声明一个变量,那么这个变量应该在任何时候都可用,直到页面结束/关闭......我在这方面是错误的吗?如果我正在运行标准for循环,则可以将动态数据推入数组中 - 这似乎是在persistence.js函数中推送的问题。

任何指导将不胜感激。我可以用我的睡眠做这个,但这是我第一次用persistence.js。在此先感谢您的帮助!

干杯! -jon-

回答

3

这与范围界定无关,而是与异步回调无关。

persistence.js是一个异步框架,因此代码不一定执行从上到下。这是人们使用异步JavaScript开始的常见错误。

随着regions.list(...)通话(你可以离开了null说法,顺便说一下),你得到执行 - 基本上你说:只要您检索该查询的结果,调用这个函数(也就是你通过匿名函数到list)。然后继续执行,执行alert,而regionList仍然为空(因为那时查询尚未完成)。

稍后,当查询结束执行时,回调函数被称为填充数组。

那么,如何解决这个问题:移动alert回调函数:

regions.list(null, function(results) { 
    results.forEach(function(r) { 
     regionList.push(r.displayName); 
    }); 
    alert(regionList); 
}); 
0

我不熟悉persistence.js,但我的第一个猜测是,名单和/或的forEach方法是无阻塞的alert(regionList);线列表之前执行和foreach有时间做第一次推到阵列上。

+0

感谢乔纳森这个答案与ZEF的组合让我正确的道路。干杯! – digitalsweetspot

相关问题