gpt4 book ai didi

javascript - 在 setTimeout 中调用异步函数

转载 作者:行者123 更新时间:2023-12-04 17:07:32 25 4
gpt4 key购买 nike

我正在开发一个使用 express 和 node js 构建的项目。
我只需要在 SetTimeout 函数中调用异步函数(回调)
这是我的 Controller 文件

module.exports.create = async (req, res) => {
try {
// Some DB Calls

setTimeout(() => updateWhOrders(req.Orders, req), 0)

// Some DB Calls

return res.status(200).json({ data , msg: "record created successfully", success: true })
} catch (error) {
if (error?.message?.includes("Validation error")) {
return handleErr({ message: "This supplier order id has already been added. Please refresh the page and check further down the screen." }, res)
}
return handleErr(error, res)
}
}
这是同一个 Controller 中的异步函数
const updateWhOrders = async (allOrders, req) => {
// Some DB Calls using async await
await SourceOrder.bulkCreate(allOrders.data, { updateOnDuplicate: ["wh_address"] })
}
现在我想问一下这两种说法的区别
1. setTimeout(() => updateWhOrders(req.Orders, req), 0)
2. updateWhOrders(req.Orders, req)
我只想在将响应发送回 API 之前并行调用 updateWhOrders 函数。
使用 setTimeout 函数有什么特殊原因吗?或者,如果我省略 setTimeout 函数,它的行为将与使用 setTimeout 函数完全相同?
根据我的理解,如果我省略 setTimeout 函数,它将通过返回一个 promise 在后台运行。如果我在 setTimeout 函数中调用 function(updateWHOrders) 会怎样。有什么好处?如果我错了,请纠正我。
先感谢您 :)

最佳答案

你不应该使用 setTimeout这里:它不会并行执行回调,而是稍后,在其余同步代码执行后。
相反,如果它是唯一一个需要在 res.status(200) 调用之前发生的异步任务,然后使用 await :

await updateWhOrders(req.Orders, req);
如果您有更多的异步任务,并且它们彼此独立,以便它们可以以任何顺序执行——并且不必等待对方的结果——那么使用 Promise.all :
await Promise.all([
updateWhOrders(req.Orders, req),
anotherAsyncFunc(),
yetAnotherAsyncFunc()
]);
setTimeout的区别
您询问了这些陈述之间的区别:
setTimeout(() => updateWhOrders(req.Orders, req), 0)
updateWhOrders(req.Orders, req)
第一个不会打电话 updateWhOrders现在,但会在所有同步代码执行后安排它执行。这可能是在下一个 await 之后在 return 之后已执行,或者如果没有执行已执行。调用堆栈必须先变空,然后才 updateWhOrders可以被执行。
第二个将执行 updateWhOrders立即地。
既不使用 updateWhOrders 的事实返回一个 promise ,所以这方面没有得到很好的处理。您会想知道 updateWhOrders 内的异步调用何时发生已经完成了它的工作,为此你需要对返回的 promise 做一些事情。这就是为什么你应该使用 .then , await , Promise.all , ...或任何与该 promise 有关的东西。

关于javascript - 在 setTimeout 中调用异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70234623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com