Wie kann man mit Promise.promisify sicherstellen, dass dies korrekt ist?

Ich versuche, meinen NodeJS-Server mithilfe von Versprechungen mit der Bluebird-Bibliothek zu überarbeiten, aber ich stecke in einem einfachen Problem fest.

Nachdem ich die Benutzer aus meiner Datenbank abgerufen habe, möchte ich alle Benachrichtigungsklassen auflisten, die diesem Benutzer zugeordnet sind:

Bad Way (funktioniert ...)

adapter.getUsers(function(users){
    users.rows.forEach(function(item){
        user = item.username;
        adapter.getNotifications(user, function(notificationList){
            console.log(notificationList);
        })
    });
});

Elegant Tentative Way (funktioniert nicht ...)

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

Wenn ich diesen Code ausführe, wird dieser Fehler jedoch in meiner getNotification-Methode angezeigt:

Unhandled Rejection TypeError: Die Eigenschaft 'nano' von undefined in Adapter.getNotifications (/Users/DaniloOliveira/Workspace/sigalei-api/api/tools/couchdb-adapter.js:387:30) in tryCatcher (/ Users / DaniloOliveira kann nicht gelesen werden /Workspace/sigalei-api/node_modules/bluebird/js/main/util.js:26:23

BEARBEITENach den wertvollen Kommentaren des Benutzers 2864740 ist mir aufgefallen, dass der Fehler mit einem Bereichsproblem zusammenhängt. Warum erkennt die Methode dont getNotifications die Umgebungsvariable "this", nachdem die Methode promisify verwendet wurde?

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

};

Antworten auf die Frage(4)

Ihre Antwort auf die Frage