【发布时间】:2015-12-15 09:24:52
【问题描述】:
我打赌这与 Javascript 的异步性或类似的东西有关。我刚刚阅读了有关承诺的内容,并认为它可能会解决我的问题,但还没有。无论如何,这是一个代码 sn-p 以及我打算用它实现的目标:
场景:我想查询 10 个表并获取最新的帖子(为了这个示例,1 个帖子)并将其存储在格式的字典中
<Class Name> : <Obj Id>
以下代码 sn-p 执行以下操作,或尝试执行以下操作:
- 构建一个名为 activeTables 的数组,其中包含要查询的表列表。这个数组本身存储在一个名为 Config 的单独表中
- 对于数组 activeTable 的每个项目,对该项目执行查询,查找最近的项目并将其添加到字典中
看起来很简单,但这是我得到的结果:
假设我们在名为 Table_1、Table_2、Table_3 的 3 个表上运行此程序,每个表上最近的 obj 分别为:recent_1、recent_2、recent_3,我在 newlist 上看到的是:
newlist = {
"Table_1" : ["recent_1", "recent_2", "recent_3"]
}
而不是:
newlist = {
"Table_1" : ["recent_1"],
"Table_2" : ["recent_2"],
"Table_3" : ["recent_3"],
}
它打败了我,虽然我能够查询 3 个表并获得最新的帖子,但只有在将其插入字典后,一旦存在一个键,它就会拒绝为每个表添加一个新键
(另外,我是不是用错了 promises?因为我仍然看到熟悉的回调地狱金字塔)
上面引用的代码sn-p:
Parse.Cloud.job("scanLists", function(request, status) {
var activeTables = [];
var getclass = Parse.Object.extend("Config");
var query = new Parse.Query(getclass);
query.equalTo("Name", "ActiveTablesConfigObj");
query.find().then(function(activetables_obj) {
var newlist = {};
activeTables = activetables_obj[0].get("cObject").Active.slice();
for (var i = 0; i < activeTables.length; i++) {
var t_name = activeTables[i];
var get_atc = Parse.Object.extend(t_name);
var query_newlist = new Parse.Query(get_atc);
query_newlist.descending("createdAt");
query_newlist.find().then(function (newlist_obj) {
if (newlist.t_name === undefined) {
newlist[t_name] = [newlist_obj[0].id];
} else {
newlist[t_name].push(newlist_obj[0].id);
}
});
}
});
});
【问题讨论】:
标签: javascript asynchronous parse-platform callback promise