我有一个测试,它测试一个异步更新数据库的外部模块,然后立即使用(更新的)值进行下一次调用。这是通过链接下面的承诺来完成的。
var expectedCateg = 'expected';
ExternalModule.loadUsers(2)
.then(function firstCallback(){
return ExternalModule.updateDBAsync(db, expectedCateg);
})
.then(function secondCallback(updatedRecord){
return ExternalModule.readDBAsync(db, categ);
})
.then(function thirdCallback(resultCateg){
if (resultCateg == expectedCateg) {
console.log("hurray")
}
})
更新数据库异步的ExternalModule有几个这样的调用:
exports.updateDBAsync(db, expectedCateg) {
return Db.getMyDb()
.updateAsync(
{ $and: [{"keyA": keyA}, {"keyB": keyB}],
"$isolated": true,
},
{ $set: {"categ": expectedCateg}},
{multi: false})
.then(function success (results) {
return results
})
}
这应该记录" hurray"但是,如果我执行它然后我手动查看数据库,使用robomongo,它就会更新。这意味着当调用secondCallback时,数据库更新操作 not 已完成。
这怎么可能?只有在操作完成后才能解决承诺的意义吗?我们如何才能确保仅在数据库更新实际完成后才传递控件?