【问题标题】:One response after few async functions几个异步函数后的一个响应
【发布时间】:2018-03-04 08:23:41
【问题描述】:

我有一个带有表单的网页,用户可以在其中编辑个人信息、教育、工作经历等。 并且用户可以添加多个学位,例如:bs、ms、phd。还有一些工作职位。

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

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({});
})

最后我做了resolve({}),但我想选择更新的配置文件并将其发回(因为在 MySQL 表中我添加了有助于我不再插入重复数据的 ID)。所以,我的问题是只有当我所有的异步 this.connection.querys 完成后,resolve({}) 怎么办?

【问题讨论】:

  • 如果您需要特定的代码帮助,您需要在问题中准确添加您正在使用的数据库模块,因为人们需要知道该接口以及它是否支持使用 Promise 来跟踪异步结果。
  • @jfriend00 对不起,你说得对。我更新了问题

标签: mysql node.js rest architecture


【解决方案1】:

我的建议是在 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
})

【讨论】:

  • 你不应该只使用 DB 库中内置的 Promise 支持吗?
  • 当然如果有,我不知道发帖者用的是哪个库。但如果它支持 Promises,只需使用 Promises。考虑到这一点,我会更新我的答案。
  • OP 已将具体的 db 包添加到问题中。
  • 似乎 mysql 包不提供 Promise 样式,它确实提供了流,但在这种情况下它无济于事,因为您仍然需要计算 'end' 事件的发生次数,所以包装回调是海事组织的最佳选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
相关资源
最近更新 更多