persistence.js将结果项推送到数组

时间:2011-07-19 04:57:37

标签: jquery arrays persistence scope

我在项目中使用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函数内推送的问题。

任何指导都将不胜感激。我可以在PHP睡眠中这样做,但这是我第一次使用persistence.js。提前感谢您的帮助!

喝彩! -Jon -

2 个答案:

答案 0 :(得分: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);
});

答案 1 :(得分:0)

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