我有调用两个异步函数的函数。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
,然后您将执行测试和条件更新,然后您将commit
或rollback
作为最后一步。
如果你需要在几个异步调用完成后做一些事情,你可能会研究使用promise(比如when)。