Dan*_*ira 11 javascript promise bluebird
我正在尝试使用与Bluebird库的promises重构我的nodejs服务器,但我陷入了一个简单的问题.
从我的数据库中获取用户之后,我想列出与该用户关联的所有通知类:
坏路(工作......)
adapter.getUsers(function(users){
users.rows.forEach(function(item){
user = item.username;
adapter.getNotifications(user, function(notificationList){
console.log(notificationList);
})
});
});
Run Code Online (Sandbox Code Playgroud)
优雅的暂定方式(不工作...)
var getNotifications = Promise.promisify(adapter.getNotifications);
adapter.getUsers().then(function(users) {
users.rows.forEach(function(item){
var dbUser = "sigalei/" + item.value.name;
console.log(dbUser);
return getNotifications(dbUser);
});
}).then(function(result){
console.log(result);
console.log("NOTIFICATIONLIST");
});
Run Code Online (Sandbox Code Playgroud)
但是,当我执行此代码时,我在getNotification方法中遇到此错误:
未处理的拒绝TypeError:无法在TryCatcher(/ Users/DaniloOliveira /)上的Adapter.getNotifications(/Users/DaniloOliveira/Workspace/sigalei-api/api/tools/couchdb-adapter.js:387:30)读取未定义的属性'nano'.工作区/ sigalei-API/node_modules /蓝鸟/ JS /主/ util.js中:26:23)
var Adapter = module.exports = function(config) {
this.nano = require('nano')({
url: url,
request_defaults: config.request_defaults
});
};
Adapter.prototype.getNotifications = function(userDb, done) {
var that = this;
console.log(that);
var userDbInstance = that.nano.use(userDb);
userDbInstance.view('_notificacao', 'lista',
{start_key: "[false]", end_key: "[false,{}]"},
function(err, body) {
if(err){ done(err); }
done(body);
});
};
Run Code Online (Sandbox Code Playgroud)
这只是调用"未绑定"方法的常见问题.
您可以将上下文作为选项传递Promise.promisify给它以使其绑定:
var getNotifications = Promise.promisify(adapter.getNotifications, {context: adapter});
Run Code Online (Sandbox Code Playgroud)
或者,您需要使用.bind()该方法,或getNotifications在adapter(使用.call())上调用新函数.您也可以考虑使用Promise.promisifyAll(adapater)然后调用adapter.getNotificationsAsync(…).
请注意,这仍然无效.你不能简单地在循环中创建promises - 你需要显式地等待它们并从then回调中返回一个promise ,否则undefined你返回的值将立即传递给下一个回调.
adapter.getUsers().then(function(users) {
return Promise.all(users.rows.map(function(item){
var dbUser = "sigalei/" + item.value.name;
console.log(dbUser);
return getNotifications(dbUser);
}));
}).then(function(results) {
for (var i=0; i<results.length; i++)
console.log("result:", results[i]);
});
Run Code Online (Sandbox Code Playgroud)
而不是Promise.all(users.rows.map(…))在Bluebird中你也可以使用Promise.map(users.rows, …).