我有调用两个异步函数的函数。主函数处理来自用户的请求。这是一个例子:
mainFunction(req, res, done) {
asyncExist(req, function(exists) {
if (!exists) {
asyncCreate(req, done);
}
})
}
问题在于我有很多请求。我的主要功能是调用异步。在调用函数asyncCreate之前,Nodejs为许多请求执行函数asyncExist。结果asyncCreate函数使用相同的参数多次调用。问题是如何处理这个基本问题?
答案 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
然后您会进行测试和有条件的更新,然后您将commit
或rollback
作为最后一步。
答案 1 :(得分:0)
如果您需要在多次异步调用完成后执行某些操作,则可以使用promises(如when)进行调查。
有关承诺的更多信息,请参阅http://blog.jcoglan.com/2013/03/30/callbacks-are-imperative-promises-are-functional-nodes-biggest-missed-opportunity/