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

时间:2013-05-16 19:46:03

标签: javascript node.js

我有调用两个异步函数的函数。主函数处理来自用户的请求。这是一个例子:

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

问题在于我有很多请求。我的主要功能是调用异步。在调用函数asyncCreate之前,Nodejs为许多请求执行函数asyncExist。结果asyncCreate函数使用相同的参数多次调用。问题是如何处理这个基本问题?

2 个答案:

答案 0 :(得分:0)

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

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

我使用了lock pattern for 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作为最后一步。

答案 1 :(得分:0)

如果您需要在多次异步调用完成后执行某些操作,则可以使用promises(如when)进行调查。

有关承诺的更多信息,请参阅http://blog.jcoglan.com/2013/03/30/callbacks-are-imperative-promises-are-functional-nodes-biggest-missed-opportunity/