Node.js NodeJS,MongoDB-添加顺序ID和承诺问题
我来自MS SQL,所以为了让我的想法更简单,我尝试创建一个等价于顺序主键的函数。使用一些在线文章和API参考资料,我构建了以下内容: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} )
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)
}).然后(()=>{
控制台日志(“序列完成”)
})