在异步进程中保存同步(不重复)信息

save synchronous (not duplicate) information in a asynchronous process

本文关键字:信息 同步 异步 进程 保存      更新时间:2023-09-26

对于这个MEAN Stack项目,我想用保存在相同的集合文档中

  • 不同类型
  • 每个类型唯一的按时间顺序排列的数字

示例:

{ID:1,类型:"a",时间:1}

{ID:2,类型:"b",时间:1}

{ID:3,类型:"b",时间:2}

{ID:4,类型:"a",时间:2}

{ID:5,类型:"b",时间:3}

在前端,我使用循环

for ( var i++; i < type.length; i++) // lets say Document type = ["a", "b"]
      for (var j++; j< 100; j++) // Creates 100 documents
        // Front end service request directing to the NodeJS Server to create a document
serverDocument.createDocument(dataS).success(function(dataR){
                        counterDOC ++;
$scope.documentID= dataR._id;
}

nodeJS服务器正在DB中查找所选文档类型的最后一个Chrono编号,并添加1。

doc = new db.Document (req.body); // req.body is for example {type: 'a'}
doc.save();
getChrono (doc); // home made function

获取Chrono功能:

var getChrono = function(doc){ 
    var config=
        {
            type : doc.type,
        }
  query = db.Document.findOne(config).sort({$natural:-1}); 
  query.exec(function (err, chrn){
        doc.chrono = 1;
      if (chrn != null)
          if(chrn.chrono != null)
            doc.chrono= chrn.chrono+1;
      doc.update();
  });

结果与此类似:

{ID:1,类型:"a",时间:1}

{ID:2,类型:"a",时间:1}

{ID:3,类型:"a",时间:1}

{ID:4,类型:"a",时间:1}

{ID:5,类型:"a",时间:2}。。。当然,对象ID是唯一的,但按时间顺序排列的数字对于一种类型的文档来说并不是唯一的。

据我所知,当下一个请求启动时,这些信息还没有保存在DB中。因此,DB中的"最后一个计时数字"并不是现实中的最后一个计时器数字。

有人能找到解决这个问题的方法吗?我不想在前端端使用同步解决方案,让服务器端管理时间编号是合乎逻辑的

递增chrono 后,可以进行save单据

因此,低于saveDoc将起作用。

function saveDoc(docBody,callback){
    var query = db.Document.findOne({type:docBody.type}).sort({chrono:-1});// I guess $natural is not that reliable
    query.exec(function (err, chrn){
      if(err)
        return callback(err);
      docBody.chrono = chrn && chrn.chrono != null?chrn.chrono+1:1;
      var doc = new db.Document(docBody); // Doc created here after getting chrono
      doc.save(callback);
  });
}

然后调用具有请求体的功能

saveDoc(req.body,function(){
 console.log('saved');
});