Node.js NodeJS,MongoDB-添加顺序ID和承诺问题

Node.js NodeJS,MongoDB-添加顺序ID和承诺问题,node.js,mongodb,Node.js,Mongodb,我来自MS SQL,所以为了让我的想法更简单,我尝试创建一个等价于顺序主键的函数。使用一些在线文章和API参考资料,我构建了以下内容: function getNextSequence(name) { var ret = db.collection('counters').findOneAndUpdate( {_id: name }, { $inc: { seq: 1 } }, {returnNewDocument: true} )

我来自MS SQL,所以为了让我的想法更简单,我尝试创建一个等价于顺序主键的函数。使用一些在线文章和API参考资料,我构建了以下内容:

  function getNextSequence(name) {
    var ret = db.collection('counters').findOneAndUpdate(
      {_id: name },
      { $inc: { seq: 1 } },
      {returnNewDocument: true}
    )

    return ret.seq;
  }

  console.log(getNextSequence("sms_id"))

  db.collection('SMS').insertOne({
      "_id":getNextSequence("sms_id"),
      record
    }, (err, result) => {
    if (err) {
      return console.log('Unable to insert record', err);
    }
    console.log(JSON.stringify(result.ops, undefined, 2));
  });
问题是getNextSequence()函数在其内部的findOneAndUpdate()方法完成之前仍在继续。经过一些调试后,我确定这是一个待定的承诺,因此我尝试进行以下更改:

  function getNextSequence(name) {
    var ret = db.collection('counters').findOneAndUpdate(
      {_id: name },
      { $inc: { seq: 1 } },
      {returnNewDocument: true}
    ).then(() => {
      return ret.seq
    });
  }

但它仍在继续。如何让它等待承诺完成?

您想构建一个异步执行序列,通过在整个代码中返回承诺,这对于承诺来说很简单:

function getNextSequence(name) {
  return db.collection('counters').findOneAndUpdate(
    {_id: name },
    { $inc: { seq: 1 } },
    {returnNewDocument: true}
  ).then(ret => ret.seq);
}
然后使用该函数:

getNextSequence('sms_id').then((seq) => {
  return db.collection('SMS').insertOne({
    "_id": seq,
    record
  });
}).then((result) => {
  console.log(JSON.stringify(result.ops, undefined, 2));
}).catch((err) => {
  console.log('Unable to insert record', err);
});
请注意,传递到
.catch
回调的错误可以来自
getNextSequence
SMS
集合上的
insertOne
方法调用

如果您从承诺的
回调中返回另一个承诺,那么
-call,下一个
。那么
-call将等待该承诺兑现。有关示例,请参见以下代码段:

函数waitAndLog(msg,ms){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
控制台日志(msg)
解决()
},ms)
})
}
waitAndLog(“那里”,1000)。然后(()=>{
返回waitAndLog(“is”,1000)
}).然后(()=>{
返回waitAndLog(“否”,1000)
}).然后(()=>{
返回waitAndLog(“勺子”,1000)
}).然后(()=>{
控制台日志(“序列完成”)

})
您希望构建一个异步执行序列,通过在整个代码中返回承诺,这一过程非常简单:

function getNextSequence(name) {
  return db.collection('counters').findOneAndUpdate(
    {_id: name },
    { $inc: { seq: 1 } },
    {returnNewDocument: true}
  ).then(ret => ret.seq);
}
然后使用该函数:

getNextSequence('sms_id').then((seq) => {
  return db.collection('SMS').insertOne({
    "_id": seq,
    record
  });
}).then((result) => {
  console.log(JSON.stringify(result.ops, undefined, 2));
}).catch((err) => {
  console.log('Unable to insert record', err);
});
请注意,传递到
.catch
回调的错误可以来自
getNextSequence
SMS
集合上的
insertOne
方法调用

如果您从承诺的
回调中返回另一个承诺,那么
-call,下一个
。那么
-call将等待该承诺兑现。有关示例,请参见以下代码段:

函数waitAndLog(msg,ms){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
控制台日志(msg)
解决()
},ms)
})
}
waitAndLog(“那里”,1000)。然后(()=>{
返回waitAndLog(“is”,1000)
}).然后(()=>{
返回waitAndLog(“否”,1000)
}).然后(()=>{
返回waitAndLog(“勺子”,1000)
}).然后(()=>{
控制台日志(“序列完成”)
})