繁体   English   中英

在 setTimeout 内调用异步 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 做一些事情。 这就是为什么你应该使用.thenawaitPromise.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM