![](/img/trans.png)
[英]How to call an async function inside setTimeout, inside another Async function?
[英]call Async function inside setTimeout
我正在开发一个使用 express 和 node js 构建的项目。 我只需要在 SetTimeout function (回调)中调用异步 function
这是我的 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 中的异步 function
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 function。
使用 setTimeout function 有什么具体原因吗? 或者,如果我省略了 setTimeout function,它的行为将与使用 setTimeout function 完全相同?
根据我的理解,如果我省略 setTimeout function,它将通过返回 promise 在后台运行。 如果我在 setTimeout function 中调用函数(updateWHOrders)怎么办。 有什么好处? 如果我错了,请纠正我。
先感谢您:)
你不应该在这里使用setTimeout
:它不会并行执行回调,但是稍后,在同步代码的 rest 执行之后。
相反,如果它是调用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中的异步调用updateWhOrders
完成其工作,为此您需要对返回的 promise 做一些事情。 这就是为什么你应该使用.then
、 await
、 Promise.all
……或任何与 promise 相关的东西。
哈萨姆。 setTimeout
main function 是asynchronously
调用一个 function 。 它返回promise
并替换 NodeJs 中的new Promise
function。 针对您的问题,在这里您不想使updateWhOrders
功能阻塞,并且希望在单独的线程中运行它而不阻塞代码的其他部分。 尽管 NodeJs 是一种单线程语言,但它使用相同的线程来处理同步和异步调用,并且使用事件循环来处理它们。 要了解有关 Event Loop 的更多信息,您可以观看此视频: https://youtu.be/8aGhZQkoFbQ
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.