Ich versuche, eine asynchrone Authentifizierung Handler, die eine Implementierung mit einem Rückruf oder Versprechen haben kann. Der Umfang ist, diese Funktion zu umhüllen, um immer ein Versprechen zurückzugeben, also kann ich es weiteren Rückruf/Versprechen Agnostic verwenden.Machen Sie JavaScript-Funktion mit Callback/Versprechen Implementierung, immer ein Versprechen
Ich wäre sehr dankbar, wenn jemand Hilfe mit diesen Szenarien bieten könnte, ist eines der Beispiele das wirkliche Leben.
Was passiert, wenn die Funktion ist so etwas wie:
function getData(id, callback) {
var deferred = Q.defer();
apiCall('/path/to/id', function (err, data) {
if (err) deferred.reject(new Error(err));
//do something with data
deferred.resolve(processedData);
}
deferred.promise.nodeify(callback);
return deferred.promise;
}
und ich möchte die .fromCallback auf diese Weise
function myProcessedDataFunction(id) {
return Promise.fromCallback(function (callback) {
return getData(id, callback);
}, {multiArgs: true});
}
Wird diese Arbeit benutzen? Wird myProcessedDataFunction eine korrekte Zusage zurückgeben?
Ein Beispiel aus der Praxis ist:
Ich habe einen Authentifizierungs-Handler, die möglicherweise oder möglicherweise nicht mit einer Callback-Funktion, und zur gleichen Zeit umgesetzt werden kann unter Verwendung Versprechen umgesetzt werden; oder es könnte einen Wahr/Falsch-Wert zurückgeben;
function authHandlerImplementation1(username, password) {
return (username === 'validUsername' && password === 'validPassword');
}
function authHandlerImplementation2(username, password, callback) {
apiCall('/path/to/authorization', function (err, result) {
if (err) return callback(err, null);
callback(null, result);
});
}
function authHandlerImplementation3(username, password) {
return new Promise(function (reject, resolve) {
apiCall('/path/to/authorization', function (err, result) {
if (err) return reject(err);
resove(result);
});
});
}
function authHandlerImplementation4(username, password, callback) {
var deferred = Q.defer();
apiCall('/path/to/id', function (err, data) {
if (err) deferred.reject(new Error(err));
//do something with data
deferred.resolve(processedData);
}
deferred.promise.nodeify(callback);
return deferred.promise;
}
Ich werde eine Bluebird-Implementierung für 5. versuchen.
function authHandlerImplementation5(username, password, callback) {
return apiCall('/path/to/id', callback).asCallback(callback); // I hope this is the right way to do it (correct me if I'm wrong, please)
}
und meine checkAuth Funktion verwendet die authHandler Implementierung und will Rückruf/Versprechen Agnostiker sein.
function checkAuth(username, password) {
var self = this;
return Promise.fromCallback(function(callback) {
return self.authHandler(username, password, callback);
}, {multiArgs: true});
}
Falls die authHandlerImplementation Rückrufe nicht verwenden (nur einen Wert zurückgibt) (implementation1), die checkAuth hängt, nichts passiert, meine Tests fehlschlagen.
Gibt es irgendeine Bluebird-Methode, die jede Art von authHandler-Implementierung in ein Versprechen einbinden kann (sei es einfache Rückgabe-, Callback- oder Versprechensimplementierung)?
Ich denke, es ist keine gute Idee, versprechen und Callback-Stil Funktionen thos Weg zu mischen. Ich denke, es ist viel besser, bei einem zu bleiben und die Funktionen beim Eintritt in die bevorzugte umzuwandeln. Der Grund ist, dass es unmöglich ist zu entscheiden, ob eine Funktion Callbacks verwendet oder nicht. Was passiert, wenn 'authHandler' synchron ist und sofort undefined zurückgibt? Und übrigens, bluebird 'fromCallback' funktioniert nur mit Callback-Style-Funktionen. –
Ich empfehle Ihnen, entweder Callbacks oder Versprechen zu wählen (hoffentlich letzteres), nicht beides. Beide zu unterstützen, ist hier unordentlich und auf der Aufrufseite. Ein Typ, an dem ich arbeite, hat ziemlich viel Code geschrieben, der beide Methoden unterstützt, und er wurde zur Wartungshölle. Ersetzen Sie es durch eine Just-Versprechungen-Implementierung halbiert die LoC und machte den Code viel einfacher zu verstehen. – Bojangles
Ich verstehe Ihre Position und stimme der Einfachheit halber einer der Varianten zu. Auf der anderen Seite möchte ich dem Endbenutzer die Freiheit geben, beides zu verwenden. Ich versuche damit nicht einen Implementierungsstil zu erzwingen. @TamasHegedus Eine der zugrunde liegenden Fragen lautet wie Sie gesagt haben: Wie können Sie herausfinden, ob eine Funktion einen Rückruf oder ein Versprechen oder keine von beiden verwendet? Ich habe jetzt herausgefunden, dass '' 'fromCallback'''' '' only''' für Funktionen ist, die mit einem Callback implementiert werden. Ich dachte, es stünde auch die Funktion des Versprechens. Wenn es eine Möglichkeit gibt, dies zu tun, bitte beraten! –