您可以使用 bluebird 来 Promisify 整个模块:
var Promise = require("bluebird");
var mongoskin = require("mongoskin");
Object.keys(mongoskin).forEach(function(key) {
var value = mongoskin[key];
if (typeof value === "function") {
Promise.promisifyAll(value);
Promise.promisifyAll(value.prototype);
}
});
Promise.promisifyAll(mongoskin);
此操作只需在应用程序中的一处完成一次,而不是在应用程序代码中的任何地方完成。
之后,您只需正常使用除 Async 后缀之外的方法,并且不传递回调:
req.db.collection('users').find().toArrayAsync()
.then(function(doc) {
if (doc) {
return req.db.collection('users').find().toArrayAsync();
}
})
.then(function(doc) {
if (doc) {
return req.db.collection('users').find().toArrayAsync();
}
})
.then(function(doc) {
if (doc) {
return req.db.collection('users').find().toArrayAsync();
}
});
再说一次,如果你调用像这样的函数
foo(a, b, c, function(err, result) {
if (err) return console.log(err);
//Code
});
承诺返回版本的调用方式如下:
fooAsync(a, b, c).then(...)
(未捕获的错误会自动记录,因此如果您只想记录它,则无需检查它们)