Mysql 几个异步函数后的一个响应

Mysql 几个异步函数后的一个响应,mysql,node.js,rest,architecture,Mysql,Node.js,Rest,Architecture,我有一个带有表单的网页,用户可以在其中编辑个人信息、教育、工作历史等。 用户可以添加多个学位,例如:学士、硕士、博士。还有一些工作岗位 当用户按下“保存”按钮时,我将所有这些数据发送到我的服务器。我在一个请求中发送了所有信息。在服务器中,我需要处理请求 app.post(config.version + '/profile', (req, res, next) => {}); 在这里,我做了一些MySQL查询来插入/更新/删除数据。我使用npm的mysql包来实现这一点 new Prom

我有一个带有表单的网页,用户可以在其中编辑个人信息、教育、工作历史等。 用户可以添加多个学位,例如:学士、硕士、博士。还有一些工作岗位

当用户按下“保存”按钮时,我将所有这些数据发送到我的服务器。我在一个请求中发送了所有信息。在服务器中,我需要处理请求

app.post(config.version + '/profile', (req, res, next) => {});
在这里,我做了一些MySQL查询来插入/更新/删除数据。我使用npm的
mysql
包来实现这一点

new Promise((resolve, reject) => {
    const userQuery = `INSERT INTO user ...;`;
    const degreesQuery = 'INSERT INTO degree ...;';
    const positionsQuery = 'UPDATE position SET ...;';

    this.connection.query(userQuery, err => {});
    this.connection.query(degreesQuery, err => {});
    this.connection.query(positionsQuery, err => {});

    resolve({});
})

最后,我会解析({}),但我希望选择更新的概要文件并将其发送回(因为在MySQL的度表中,我添加了ID,以帮助我不再插入重复数据)。所以,我的问题是,只有当我所有的async
this.connection.query
都完成时,如何解析({})?

我的建议是在一个Promise.all()中运行所有查询

例如:

const queries = [
    `INSERT INTO user ...;`;,
    'INSERT INTO degree ...;',
    'UPDATE position SET ...;'
];

Promise.all(queries.map((query) => {
    return new Promise((resolve, reject) => {
         this.connection.query(query, err => {
             return err ? reject(err) : resolve();
         });
    });
})
.then(() => {
    // continue
    // get your updated data here with and send it as response
})
如果您的db库支持Promise,请以这种方式编写

Promise.all(queries.map((query) => {
    return this.connection.query(query);
})
.then(() => {
    // continue
    // get your updated data here with and send it as response
})

我的建议是在Promise.all()中运行所有查询

例如:

const queries = [
    `INSERT INTO user ...;`;,
    'INSERT INTO degree ...;',
    'UPDATE position SET ...;'
];

Promise.all(queries.map((query) => {
    return new Promise((resolve, reject) => {
         this.connection.query(query, err => {
             return err ? reject(err) : resolve();
         });
    });
})
.then(() => {
    // continue
    // get your updated data here with and send it as response
})
如果您的db库支持Promise,请以这种方式编写

Promise.all(queries.map((query) => {
    return this.connection.query(query);
})
.then(() => {
    // continue
    // get your updated data here with and send it as response
})

如果您需要特定的代码帮助,您需要在问题中添加您正在使用的数据库模块,因为人们需要知道该接口以及它是否支持使用承诺来跟踪异步结果。@jfriend00很抱歉,您是对的。我更新了questionRelated:如果您需要特定的代码帮助,您需要在问题中添加您正在使用的数据库模块,因为人们需要知道该接口以及它是否支持使用承诺来跟踪异步结果。@jfriend00很抱歉,您是对的。我更新了与此相关的问题:您不应该只使用DB库中的内置promise支持吗?当然,如果有,我不知道海报正在使用哪个库。但如果它支持承诺,就使用承诺。我会更新我的答案。OP已经将特定的db包添加到问题中。看起来mysql包不提供承诺风格,它提供流,但在这种情况下它不会有帮助,因为您仍然需要计算“结束”事件的发生次数,所以包装回调是最好的选择。你不应该只使用DB库中的内置promise支持吗?当然,如果有,我不知道海报正在使用哪个库。但如果它支持承诺,就使用承诺。我将更新我的答案。OP已将特定的db包添加到问题中。mysql包似乎不提供Promise样式,它确实提供流,但在这种情况下,它不会有帮助,因为您仍然需要计算“end”事件的发生次数,所以包装回调是最好的选择。