这种异步执行的情况会发生什么?

问题描述 投票:0回答:1
const deleteData = async (result) => {
  await Promise.all([
    deleteFromCollectionA(result),
    deleteFromCollectionB(result),
    deleteFromCollectionC(result),
  ]);
};

const recalculateData = async () => {
  const rows = await database("someTable");

  for (let i = 0; i < rows.length; i++) {
    const message = mapToMessage(record);
    await pushToQueue(message);
  }
};

const recalculate = async (result) => {
  await deleteData(result);
  await recalculateData(result);
};

以上代码在服务文件中。这是控制器中的代码

async function recalculate(req, res) {
  await recalculate();
}

这是路线

router.post("/recalculate", recalculate);

我无法理解异步性以及在这种情况下到底会发生什么。

deleteData() 从多个 MongoDb 集合中删除文档。

recalculateData() 从 SQL 数据库中获取记录,迭代它们,进行一些映射,然后将每条记录发送到 Kafka 主题,以供服务使用和处理。该处理的结果将插入到 MongoDB 集合中。

recalculateDate 会等到所有应该删除的文档都被删除后才开始执行吗?

如果在某个 API 端点执行 recalculate(),它会阻止在该特定端点处处理请求,直到 recalculateData() 启动的所有处理完成为止吗?我所说的“所有处理”是指从 SQL 表中获取所有记录并将其发送到 Kafka 主题,从 Kafka 主题使用的服务完成处理推送到该队列的所有消息,并将结果插入到多个 MongoDb 集合。

javascript node.js asynchronous
1个回答
0
投票

recalculateDate 会等到所有应该删除的文档都被删除后才开始执行吗?

是的,因为您已经在

Promise.all(...)
函数中等待了
deleteData
返回的承诺。

如果在某个 API 端点执行 recalculate(),它会阻止在该特定端点处理请求,直到 recalculateData() 启动的所有处理完成吗?

不,不会。您的异步操作将在后台处理,与此同时,主线程可以执行其他操作,例如处理其他请求。

换句话说,主线程可以处理其他请求,同时不同的

await
语句等待 Promise 解决。

“所有处理”是指从 SQL 表中获取所有记录并将其发送到 Kafka 主题,从 Kafka 主题使用的服务完成处理推送到该队列的所有消息,并将结果插入到多个 MongoDb 集合。

如果您的消费者在处理请求的同一线程上执行,那么只要代码在主线程上执行,它们就会阻塞。换句话说,例如,如果处理包括执行一些计算或执行循环,同步代码将会阻塞。

他们所做的任何异步工作,例如在 MongoDB 中保存记录都不会阻塞主线程。

© www.soinside.com 2019 - 2024. All rights reserved.