在 for 循环中解析查询(回调)
Parse query (callback) in for loop
这里的javascript新手,所以回调在我的大脑中仍然有点不稳定。
我要做的是:给定一个"菜单",它是一个 objectId 数组,查询与该 objectId 对应的每个 foodItem,获取它的投票,将其放入最小堆中(以确定哪些是前 5 个项目),并返回前 5 个项目。
我最后的堆是空的,因为我意识到 JavaScript 是异步的,当我尝试获取堆数据时,回调可能不一定完成。
如果只是一个调用,我只会嵌套回调,但由于这是一个循环,我不确定该怎么做。
function getTopFoods(menu, heap, callback) {
//go through each objectId, get its foodItem and then its votes, then heap it
console.log("got to TopFoods");
for (var i = 0; i < menu.length; i++) {
var foodID = menu[i];
var FoodItem = Parse.Object.extend("FoodItem");
var foodQuery = new Parse.Query(FoodItem);
foodQuery.equalTo("objectId", foodID);
//get corresponding foodItem
foodQuery.find({
success: function(foodResult) {
//got specific food Item
var votes = foodResult.get("votes");
console.log("votes: " + votes);
if (heap.length < 5) {
heap.queue(foodResult);
} else {
if (votes > heap.peek().get("votes")) {
heap.dequeue();
heap.queue(foodResult);
}
}
},
error: function(error) {
console.log("Food error: " + error.code + " " + error.message);
}
});
}
var topFoods = [];
for (var i = 0; i < 5; i++) {
topFoods[i] = heap.dequeue();
}
callback(topFoods);
}
最简单的方法是使用 promises;在这个阶段,这涉及使用一个库(在 ES6 中使用 JavaScript)。如果你想要一个低技术的解决方案,只需数数东西:
var waitingCount = menu.length;
for (....) {
...
success: function(foodResult) {
...
if (!--waitingCount) {
callback(topFive(heap));
}
},
error: function(error) {
--waitingCount;
...
}
...
}
这只是基本思想。如果您还减少失败响应的计数器,那就太好了,因为这样一次失败会让您挂起。
编辑:错误,显然,检查需要转到success
的底部,而不是像我的片段之前指出的那样转到顶部,否则您将错过最后一个元素。我也输入了错误案例。
编辑2:正如eth3lbert所指出的,parse.com API也支持承诺(我不 parse.com 工作,所以......感谢您的提示)。在这种情况下,您可以执行以下操作:
var promises = [];
for (....) {
var promise = foodQuery.find({
...
});
promises.push(promise);
});
Parse.Promise.when(promises).then(function()) {
callback(topFive(heap));
}
相关文章:
- 查询后websql成功回调无法访问变量
- j查询关于回调函数的术语
- 解析查询.首次成功/错误 间歇性不调用回调
- 使用qunit.js查询事件回调测试
- 从Node.js查询Neo4j时看不到任何回调
- 当查询返回对象时,Express Mongo回调返回undefined
- 如何显示查询回调数据结果仅从开始
- j查询多个回调到一个回调计数调用
- j查询行在回调函数中不起作用
- 节点-Postgres 查询方法不调用其回调函数
- 谷歌电子表格查询查询.发送回调函数返回值
- 如何查询回调方法的参数
- 在 for 循环中解析查询(回调)
- j查询链接与动画函数的回调
- 函数newbie查询中的nodejs回调
- 如何在mysql中挑选变量.查询回调函数
- 数据源查询回调问题(调用顺序,改变全局变量的能力)
- Node.js和mysql Callback:查询回调中的查询
- 在NodeJS cronjob中没有调用猫鼬查询回调
- 将值传递给嵌套的parse.com查询回调