同步node.js瀑布控制流程

时间:2016-02-15 12:52:32

标签: javascript node.js mongodb

我们正在开发一个让人们借钱的应用程序。我有一个node.js + mongodb逻辑,我真的不知道如何处理它。

数据模型如下所示,表示愿意向其他人借钱的用户名单(假设只有3家贷方):

[
{
  _id:"100",
  amount:10.00
},
{
  _id:"101",
  amount:10.00
},
{
  _id:"102",
  amount:20.00
}
]

有一个用户想借,比如$ 20.00并点击提交。后端node.js将查询mongodb执行以下逻辑:

1。通过限制20条记录来查询mongodb 代码:

db.collection('post').find(
    {
        borrowed_date:{$exists:false}
    }).toArray(function(err, result) { 

    });

2。循环通过结果并累计金额,直到与借款人的金额完全匹配。 第3。为那些匹配的记录更新mongodb,最后得到的数据库如下(借20美元):

[ {   _id: “100”   金额:10.00,   borrowed_date:ISODate( “2016-02-16T06:43:29.869Z”) },

{   _id: “101”,   金额:10.00,   borrowed_date:ISODate( “2016-02-16T06:43:29.869Z”) },

{   _id: “102”,   金额:10.00 } ]

代码:

db.collection('post').update(
    {
        _id:100,
        borrowed_date:{$exists:false}
    }, 
    {$set:{borrowed_date:new Date()}}, 
    {w:1},
    function(err, result) {

    });

上面的步骤我使用async.waterfall来控制。如果每个借用者点击借位按钮之间的时间是10秒,那就不会有问题:

  1. 借款人借款于2016-02-16T06:00:00
  2. 借款人借款于2016-02-16T06:00:10
  3. 借款人借款于2016-02-16T06:00:20
  4. 如果在给定时间2借款人在同一时间借款,那将是一个问题。假设借款人1要借20美元而借款人1要借10美元。 因此,在步骤1中,两个borrower1将获得2个id为100和101的记录.borrower2将获得1个id为100的记录(他应该获得id 102)。

    async.waterfall是异步的,不会等到所有函数完成后第二个请求进入瀑布循环。

    知道如何处理这种情况吗?

1 个答案:

答案 0 :(得分:0)

使用setImmediate将包装所有逻辑以获取所有发布,因此它一次一个

**

  

如果要将函数排在任何I / O后面,请使用setImmediate   已经在事件队列中的事件回调。

**

setImmediate(function searchPost() { 

   // all code here

});