Wie stelle ich "This" mit Promise.promisify sicher?

8

Ich versuche, meinen Nodejs-Server mit Versprechen mit Bluebird-Bibliothek zu refactory, aber ich bin in einem einfachen Problem stecken.

Um die Benutzer von meiner Datenbank abzurufen, möchte ich alle Benachrichtigungsklassen für diesen Benutzer auflisten:

Schlechter Weg (funktioniert ...)

%Vor%

Elegant mit Vorbehalt (funktioniert nicht ...)

%Vor%

Wenn ich diesen Code ausführe, bekomme ich diesen Fehler innerhalb meiner getNotification-Methode:

  

Nicht behandelte Ablehnung TypeError: Kann die Eigenschaft 'nano' von undefined nicht lesen      bei Adapter.getNotifications (/Users/DaniloOliveira/Workspace/sigalei-api/api/tools/couchdb-adapter.js:387:30)       bei tryCatcher (/Users/DaniloOliveira/Workspace/sigalei-api/node_modules/bluebird/js/main/util.js:26:23)

BEARBEITEN

Nach den wertvollen Kommentaren von user2864740 habe ich festgestellt, dass der Fehler mit einem gewissen Umfangproblem zusammenhängt. Also, warum nach der Promisify-Methode, die Methode nicht getNotifications erkennen die "this" env-Variable?

%Vor%     
Danilo Oliveira 10.09.2015, 19:11
quelle

2 Antworten

6

Dies ist nur das sehr häufige Problem beim Aufruf von "ungebundenen" Methoden .
Sie können den Kontext als Option an Promise.promisify übergeben, damit er gebunden wird:

%Vor%

Alternativ dazu müssten Sie .bind() die Methode verwenden oder die neue Funktion getNotifications für adapter (mit .call() ) aufrufen. Sie können auch Promise.promisifyAll(adapater) verwenden und dann nur adapter.getNotificationsAsync(…) aufrufen.

Beachten Sie, dass dies immer noch nicht funktioniert. Sie können Versprechen nicht einfach in einer Schleife erstellen - Sie müssen sie explizit abwarten und eine Zusage aus dem then -Rückruf zurückgeben, andernfalls wird nur der von Ihnen zurückgegebene undefined -Wert sofort an den nächsten Callback übergeben.

%Vor%

Anstelle von Promise.all(users.rows.map(…)) können Sie in Bluebird auch Promise.map(users.rows, …) verwenden.

    
Bergi 10.09.2015, 21:03
quelle
1

Was ist mit einfach

? %Vor%

oder möglicherweise

%Vor%

?

Ich bin mir nicht sicher, ob ich dein Problem gut verstehe, aber das sollte sicherstellen, dass this gebunden ist und nicht undefined , wenn du return getNotifications(dbUser);

tust     
jrsala 10.09.2015 20:02
quelle

Tags und Links