如何在node.js中的一个步骤中运行两个异步操作作为一个原子操作



我有调用两个异步函数的函数。main函数处理来自用户的请求。下面是示例:

mainFunction(req, res, done) {
   asyncExist(req, function(exists) {
       if (!exists) {
           asyncCreate(req, done);
       }
   })
}

问题是当我有很多请求时。我的主要功能是调用async。Nodejs在调用asyncCreate函数之前对许多请求执行asyncExist函数。在结果中,asyncCreate函数使用相同的参数被多次调用。问题是如何解决这个根本问题?

您需要一个锁定机制。我不确定你使用的是什么数据存储,但你需要弄清楚它提供了什么样的锁或事务原语。

数据存储上的锁允许您允许第一个请求使后续请求在asyncExist开始之前等待,直到第一个请求完全完成。

我已经为redis使用了一个锁模式,看起来像这样:

mainFunction(req, res, done) {
  asyncGetLock(function(releaseLock) {
    asyncExist(req, function(exists) {
      if(exists) {
        releaseLock();
        return;
      }
      asyncCreate(req, done, function() {
        releaseLock();
      });
    });
  });
}

如果使用其他数据存储,也适用类似的概念。例如,在SQL中,它被称为事务。您的第一个请求将是begin transaction,然后您将执行测试和条件更新,然后您将commitrollback作为最后一步。

如果你需要在几个异步调用完成后做一些事情,你可能会研究使用promise(比如when)。

最新更新