0

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

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

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

4

2 回答 2

0

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

数据存储上的锁定允许您允许第一个请求使后续请求在开始之前等待,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作为最后一步。

于 2013-05-16T19:59:11.393 回答
0

如果您需要在几个异步调用完成后执行某些操作, 您可能会使用 Promise(例如when )进行调查。

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

于 2013-05-16T19:59:40.240 回答