2017-12-03 207 views
0

我有一个REST API,它会一个接一个地执行一系列异步任务。代码如下所示:在Node.js中锁定承诺链接

asyncFunc1() 
.then(asyncFunc2()) 
.then(asyncFunc3()) 
.then(asyncFunc4()) 

第一步将执行一些数据库查询,最后一步将更新数据库。当然(因为我来自java/c + +背景),我会在我的承诺链的开头添加一个锁,以确保与数据库的交互受到保护。

但我是新来的Node.js和它的异步处理单线程模式困惑我在这里。因此,我应该在每个涉及数据库操作的步骤中添加一个锁,在我的承诺链的开头链接或添加锁,或者我根本不需要锁?

-------- ---------更新

正如一位评论和答复指出了这一点,我写我的错链(我的实际代码是正确的,虽然,只是一个签署表明我是新来的Node.js:$)

asyncFunc1() 
    .then(asyncFunc2) 
    .then(asyncFunc3) 
    .then(asyncFunc4) 

其实我在我的链的开头使用Redlock,我不知道这是一个好主意。拉胡尔辛格提供的答案表明我不需要锁定!

+0

什么抵抗锁定后卫? – stone

+0

首先,你的连锁店是错误的。它应该是'asyncFunc1()。then(asyncFunc2).then(asyncFunc3)'等等...传递函数引用 - 不要先调用它们并传递返回结果。 – jfriend00

+0

具有故意排序的命令的单线程模式不应该针对该代码序列进行数据库锁定。但是,如果有其他请求可能同时运行,那么如何处理数据库更新以避免并发问题完全取决于您的代码正在执行的操作以及数据库的工作方式。对于锁没有通用要求,但是对于数据库来说,读取某些内容,修改内容并将其写回等操作可能需要以某种方式受到来自其他请求的竞争条件的保护,这些请求也使用数据库。 – jfriend00

回答

0

当您使用新的承诺承诺()被调用,因此所有 你的函数为您创建它们,而不是当你 连锁它们实际上被执行。

您链功能应该像

asyncFunc1().then(asyncFunc2).then()... 

的asyncFunc1应该是返回一个承诺,而不是一个承诺本身的功能。

诺兰劳森就以承诺一脸这article更多

+0

是的,我在这里写错了(作为一个标志,我是新的node.js:$我的实际代码是正确的,正如你所说) – Qiulang

+0

@Qiulang总之,你不需要锁,然后在承诺将处理。 –

+0

作为我从@ jfriend00得到的另一个评论,我的代码完全“读取某些内容,修改它并将其写回”。我假设我的REST API可能会在同一时间被调用,所以我添加了一个锁。 – Qiulang