在 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 何时完成其工作,为此您需要对返回的承诺做一些事情。这就是为什么您应该使用 .thenawaitPromise.all,...或任何处理该承诺的内容。