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?
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:
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.
Anstelle von Promise.all(users.rows.map(…))
können Sie in Bluebird auch Promise.map(users.rows, …)
verwenden.
Tags und Links javascript promise bluebird