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

问题描述:

我有调用两个异步函数的函数。主要功能处理来自用户的请求。这里是例子:如何在node.js中的一个步骤中执行两个异步操作作为一个原子操作?

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

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

+0

我没有看到这个问题。函数总是会用正确的参数调用一次。 – TheHippo

+0

请注意我正在谈论多重请求。 – hsd

+0

node.js是单线程的,所以数据不会混淆。每次处理一个请求,每当发生回调或“回来”时都切换上下文。 – TheHippo

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

数据存储区上的锁定允许您允许第一个请求在第一个请求完成之前让后续请求等待,然后再以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作为最后一步。

+0

这可以解决我的问题。我正在使用mongodb。问题如何使用锁定这个数据库? – hsd

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

http://blog.jcoglan.com/2013/03/30/callbacks-are-imperative-promises-are-functional-nodes-biggest-missed-opportunity/关于承诺的详细信息...

+0

这是什么不能解决问题。类似的东西在异步库或步骤中,但这不是解决方案。 – hsd