升级到 MongoDB 7 删除了函数回调,正如其他线程中所讨论的那样。大多数时候,用 .then asyn/await 等替换回调相当容易,如 MongooseError: Model.findOne() 不再接受 Function 处的回调所述。但这让我感到困惑:
return _.bind(function(req, res, next) {
var query = this.getQuery(req);
async.waterfall([
_.bind(query.exec, query),
], this.sendData(req, res, next));
}, this);
将 lodash 绑定函数包装在 async.waterfall 中具有承诺的效果: this.sendData 仅在绑定函数完成后执行。但是,“_.bind(query.exec, query)”表达式引发“不再接受回调函数”异常。那么我该如何重写以避免异常呢?
继续:我可以通过此调用从数据库获取数据:
query.exec() .then(result => {
console.log(result);
})
所以我可以不使用异步包装器并执行类似的操作:
return _.bind(function(req, res, next) {
var query = this.getQuery(req);
query.exec() .then(result => {
this.sendData(req, res, next);
});
})
目前这不起作用,因为查询结果需要绑定到 this 对象。我不知道该怎么做。
在您建议的使用承诺的解决方案中,看起来问题是因为您在
this
函数中缺少这个 _.bind
而引起的。
该函数应如下所示:
return _.bind(function(req, res, next) {
var query = this.getQuery(req);
query.exec().then(result => {
this.sendData(req, res, next);
});
}, this)
您还可以通过使用外部包装器的箭头函数来完全替换对
_.bind
的调用,但也许您使用它是有原因的 - 例如
return (req, res, next) => {
this.getQuery(req).exec().then(result => {
this.sendData(req, res, next);
});
}