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 集合。
recalculateDate 会等到所有应该删除的文档都被删除后才开始执行吗?
是的,因为您已经在
Promise.all(...)
函数中等待了 deleteData
返回的承诺。
如果在某个 API 端点执行 recalculate(),它会阻止在该特定端点处理请求,直到 recalculateData() 启动的所有处理完成吗?
不,不会。您的异步操作将在后台处理,与此同时,主线程可以执行其他操作,例如处理其他请求。
换句话说,主线程可以处理其他请求,同时不同的
await
语句等待 Promise 解决。
“所有处理”是指从 SQL 表中获取所有记录并将其发送到 Kafka 主题,从 Kafka 主题使用的服务完成处理推送到该队列的所有消息,并将结果插入到多个 MongoDb 集合。
如果您的消费者在处理请求的同一线程上执行,那么只要代码在主线程上执行,它们就会阻塞。换句话说,例如,如果处理包括执行一些计算或执行循环,同步代码将会阻塞。
他们所做的任何异步工作,例如在 MongoDB 中保存记录都不会阻塞主线程。