Javascript “如何确保正确”;这";带着承诺。承诺?

Javascript “如何确保正确”;这";带着承诺。承诺?,javascript,promise,bluebird,Javascript,Promise,Bluebird,我试图使用Bluebird库重构我的nodejs服务器,但我遇到了一个简单的问题 从my db获取用户后,我想列出与此用户关联的所有通知类: 坏方法(工作…) 优雅的尝试方式(不工作…) 但是,当我执行此代码时,在getNotification方法中会出现以下错误: 未处理的拒绝类型错误:无法读取未定义的属性“nano” 在Adapter.getNotifications(/Users/DaniloOliveira/Workspace/sigaleiapi/api/tools/couchdb A

我试图使用Bluebird库重构我的nodejs服务器,但我遇到了一个简单的问题

从my db获取用户后,我想列出与此用户关联的所有通知类:

坏方法(工作…)

优雅的尝试方式(不工作…)

但是,当我执行此代码时,在getNotification方法中会出现以下错误:

未处理的拒绝类型错误:无法读取未定义的属性“nano” 在Adapter.getNotifications(/Users/DaniloOliveira/Workspace/sigaleiapi/api/tools/couchdb Adapter.js:387:30) 在tryCatcher(/Users/DaniloOliveira/Workspace/sigalei api/node_modules/bluebird/js/main/util.js:26:23)

编辑 在用户2864740的宝贵评论之后,我注意到这个错误与一些范围问题有关。那么,为什么在使用promisify方法之后,该方法不识别“this”env变量呢

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);
    });

};
简单地说呢

var getNotifications = Promise.promisify(adapter.getNotifications.bind(adapter));
或者可能

var getNotifications = Promise.promisify(function () {
    return adapter.getNotifications.apply(adapter, arguments);
});
?

我不确定我是否理解您的问题,但这应该确保
是绑定的,而不是
未定义的
当您执行
返回getNotifications(dbUser)时

简单点怎么样

var getNotifications = Promise.promisify(adapter.getNotifications.bind(adapter));
或者可能

var getNotifications = Promise.promisify(function () {
    return adapter.getNotifications.apply(adapter, arguments);
});
?


我不确定我是否理解您的问题,但这应该确保
是绑定的,而不是
未定义的
当您执行
返回getNotifications(dbUser)时

这是非常常见的。
您可以将上下文作为选项传递,以将其绑定:

var getNotifications = Promise.promisify(adapter.getNotifications, {context: adapter});
或者,您需要
.bind()
方法,或者在
适配器上调用新的
getNotifications
函数(使用
.call()
)。您也可以考虑使用<代码>承诺。 请注意,这仍然不起作用。您不能简单地在循环中创建承诺-您需要显式地等待它们并从
然后
回调返回承诺,否则您返回的
未定义的
值将立即传递到下一个回调

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]);
});
adapter.getUsers().then(函数(用户){
返回Promise.all(users.rows.map)(函数(项){
var dbUser=“sigalei/”+item.value.name;
log(dbUser);
返回getNotifications(dbUser);
}));
}).然后(函数(结果){

对于(var i=0;i而言,这是非常常见的。
您可以将上下文作为选项传递,以将其绑定:

var getNotifications = Promise.promisify(adapter.getNotifications, {context: adapter});

可选的,您需要在<代码>适配器/<代码>(使用<代码> >()(代码)>下,调用<代码> > b>(代码)>方法>,或调用新< <代码> GETNoTobug > /Cuff>函数。您也可以考虑使用<代码>承诺> PrimiFyAL(Actuabor)< /Cord>,然后只调用<代码>适配器.GETNoTimeCaseStasc(…) ./P> 请注意,这仍然不起作用。您不能简单地在循环中创建承诺-您需要显式地等待它们,然后从

回调返回一个承诺,否则您返回的
未定义的值将立即传递到下一个回调

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]);
});
adapter.getUsers().then(函数(用户){
返回Promise.all(users.rows.map)(函数(项){
var dbUser=“sigalei/”+item.value.name;
log(dbUser);
返回getNotifications(dbUser);
}));
}).然后(函数(结果){

对于(var i=0;iHey,该错误是在“promisify”的getNotifications方法中生成的。@user2864740再次编辑该问题,我认为该问题与范围变量有关…请尝试
.call()
使用
适配器将其设置为
this
。嘿,错误是在“promisify”的getNotifications方法中生成的。@user2864740再次编辑了问题,我认为问题与范围变量有关…请尝试
.call()
使用
适配器将其绑定为
this
。您是正确的,感谢您对这个问题和“unbound”方法的详细解释。在Bluebird 3.4.6中,上下文是这样绑定的:
promisify(adapter.getNotifications,{context:adapter});
您说得对,谢谢您对这个问题和“未绑定”方法的详细解释。在Bluebird 3.4.6中,上下文是这样绑定的:
promisify.promisify(adapter.getNotifications,{context:adapter});