javascript - 如何等到async.forEachOf完成,然后将结果发送给客户端?

标签 javascript node.js

我有一个/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/

相关文章:

javascript - 从具有命名空间的哈希值调用 Javascript 函数

javascript - 我如何通过 javascript(d3) 更改 Node CSS 的样式

javascript - 在 ECMAScript 中,一些原生对象是如何内置的?

javascript - 使用 Angular 4 Form Group 编辑和添加新数据

node.js - 带有快速路由错误的 typescript /Node API

node.js - 使用javascript、游标方法进行mongodb查询

node.js - 如何在 Meetup API 中创建用户

performance - nodejs、dynamodb 表获取操作回调或异步

node.js - 使用 async wait 后代码非常慢?

javascript - ChartJs多轴图表显示不同的标签底部和顶部