我有一个/get 路由,可以从数据库获取一些数据并将其发送给用户。 问题是我使用了两个带有 async.forEachOf 语句的函数。我不知道如何等到第二个 async.forEachof 完成然后将整个结果发送回用户。
我认为我需要使用 Promise 或类似的东西,但我无法管理如何在我的函数中使用它。有人可以帮我吗,这已经困扰我两天了。谢谢您,祝您有美好的一天。
这些是功能:
function getSetsFromWorkout(workouts) {
const selectSetsQuery = "SELECT id, set_number, workoutFKEY FROM sets WHERE workoutFKEY = ?"
async.forEachOf(workouts, function (workout, key, callback) {
const workoutId = workout.id
getConnection().query(selectSetsQuery, [workoutId], (err, setsRows, result) => {
if (err) {
console.log("Failed to query for users: "+ err)
res.sendStatus(500)
res.end()
} else {
workout["sets"] = setsRows
getExercisesFromSets(workout)
}
callback()
});
}, function (err) {
if (err) console.log(err.message);
});
};
function getExercisesFromSets(sets) {
const selectExercisesQuery = "SELECT id, ex_time, type, ex_id FROM user_exercises WHERE setsFKEY = ?"
const allSets = sets["sets"]
async.forEachOf(allSets, function (set, key, callback) {
const setId = set.id
getConnection().query(selectExercisesQuery,[setId], (err, exercisesRows, result)=> {
if (err) {
console.log("Failed to query for users: "+ err)
res.sendStatus(500)
res.end()
} else {
console.log("add exercise")
set["exercises"] = exercisesRows
callback()
}
});
}, function(err) {
if (err) console.log(err.message)
console.log("ENDED")
console.log(sets)
});
};
这是基于console.log()语句的输出。结果是我需要的,但我不知道如何在 forEachOf 循环完成后发送它。
如果我将 res.json(sets) 放在这里,它只会将 forEachOf 的第一次迭代发送回客户端,然后它将停止。
function(err) {
if (err) console.log(err.message)
console.log("ENDED")
console.log(sets)
**res.json(sets)**
});
};
我需要等待所有迭代完成,然后将数据发送到 sclient。
add exercise
add exercise
add exercise
ENDED
//MY data from db
add exercise
ENDED
// My other set of data from db
最佳答案
我认为您可以创建一个由 async.forEach
回调调用的函数和一个变量来检查两个进程是否已结束(例如,可能是一些不同的方法来获得相同的结果)结果)。像这样的事情:
var ended = { array1: false, array2: false };
const dataToReturn = {};
const array1 = [];
async.forEachOf(array1, function (item, key, callback) {
// do stuff
dataToReturn.array1 = "first data";
callback();
}, function (err) {
if (err) console.log(err.message);
else {
ended.array1 = true;
endProcess();
}
});
const array2 = [];
async.forEachOf(array2, function (item, key, callback) {
// do stuff
dataToReturn.array2 = "first data";
callback();
}, function (err) {
if (err) console.log(err.message);
else {
ended.array2 = true;
endProcess();
}
});
function endProcess() {
if (!ended.array1 || !ended.array2) return;
res.json(dataToReturn);
}
关于javascript - 如何等到async.forEachOf完成,然后将结果发送给客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56479476/