gpt4 book ai didi

javascript - 在for循环中解析查询(回调)

转载 作者:行者123 更新时间:2023-12-03 11:18:36 30 4
gpt4 key购买 nike

这里是 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);
}

最佳答案

最简单的方法是使用 Promise;在此阶段,这涉及到使用库(在 ES6 中使用 JavaScript)。如果您想要一个低技术含量的解决方案,只需计算一下即可:

var waitingCount = menu.length;
for (....) {
...
success: function(foodResult) {
...
if (!--waitingCount) {
callback(topFive(heap));
}
},
error: function(error) {
--waitingCount;
...
}
...
}

这只是基本想法。如果您还减少失败响应的计数器,那就太好了,因为这样一次失败就会让您挂起。

编辑:呃,显然,检查需要转到成功底部,而不是像我之前的代码片段所示的那样到顶部,否则你会错过最后一个元素。我也把错误的情况也放进去。

EDIT2:正如 eth3lbert 所指出的,parse.com API 也支持 Promise(我不使用 parse.com,所以...感谢您的提示)。在这种情况下,您需要执行以下操作:

var promises = [];
for (....) {
var promise = foodQuery.find({
...
});
promises.push(promise);
});
Parse.Promise.when(promises).then(function()) {
callback(topFive(heap));
}

关于javascript - 在for循环中解析查询(回调),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27221896/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com