在 setTimeout 中调用 Async 函数
call Async function inside setTimeout
我正在开发一个使用 express 和 node js 构建的项目。
我只需要在 SetTimeout 函数中调用异步函数(回调)
这是我的控制器文件
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)
}
}
这是同一个控制器中的异步函数
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 函数,它将 运行 在后台返回一个承诺。如果我在 setTimeout 函数中调用 function(updateWHOrders) 会怎样?有什么好处?如有不妥请指正
提前致谢:)
哈萨姆。 setTimeout
主要功能是调用一个函数asynchronously
。它 returns 是 promise
并且是 NodeJs 中 new Promise
函数的替代品。
关于您的问题,在这里您不想使 updateWhOrders
函数阻塞,而是希望在单独的线程中 运行 它而不阻塞代码的其他部分。尽管 NodeJs 是一种单线程语言,但它使用相同的线程来处理同步和异步调用,并且它们是使用事件循环处理的。要了解有关事件循环的更多信息,您可以观看此视频:https://youtu.be/8aGhZQkoFbQ
你不应该在这里使用 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
执行之后,或者如果有 none,则在 return
执行之后。调用堆栈必须先变空,然后才能执行 updateWhOrders
。
第二个将立即执行updateWhOrders
。
也没有使用 updateWhOrders
returns promise 的事实,所以这方面没有很好地处理。您会想知道异步调用 inside updateWhOrders
何时完成其工作,为此您需要对返回的承诺做一些事情。这就是为什么您应该使用 .then
、await
、Promise.all
,...或任何处理该承诺的内容。
我正在开发一个使用 express 和 node js 构建的项目。 我只需要在 SetTimeout 函数中调用异步函数(回调)
这是我的控制器文件
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)
}
}
这是同一个控制器中的异步函数
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 函数,它将 运行 在后台返回一个承诺。如果我在 setTimeout 函数中调用 function(updateWHOrders) 会怎样?有什么好处?如有不妥请指正
提前致谢:)
哈萨姆。 setTimeout
主要功能是调用一个函数asynchronously
。它 returns 是 promise
并且是 NodeJs 中 new Promise
函数的替代品。
关于您的问题,在这里您不想使 updateWhOrders
函数阻塞,而是希望在单独的线程中 运行 它而不阻塞代码的其他部分。尽管 NodeJs 是一种单线程语言,但它使用相同的线程来处理同步和异步调用,并且它们是使用事件循环处理的。要了解有关事件循环的更多信息,您可以观看此视频:https://youtu.be/8aGhZQkoFbQ
你不应该在这里使用 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
执行之后,或者如果有 none,则在 return
执行之后。调用堆栈必须先变空,然后才能执行 updateWhOrders
。
第二个将立即执行updateWhOrders
。
也没有使用 updateWhOrders
returns promise 的事实,所以这方面没有很好地处理。您会想知道异步调用 inside updateWhOrders
何时完成其工作,为此您需要对返回的承诺做一些事情。这就是为什么您应该使用 .then
、await
、Promise.all
,...或任何处理该承诺的内容。