我在项目中使用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 -
答案 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有时间之前执行做第一次推到阵列上。