Leitfaden zum Übergang von JS-SDK-Callbacks zu Promises
In dieser Anleitung wird erläutert, wie Sie bestehenden JavaScript-SDK-Code für die Vonage Video API von Callback-basierten Abschlusshandlern auf Promise-basierte APIs umstellen können.
Übersicht
Ab Version 2.35.1 unterstützt das JavaScript-SDK die Promise-basierte Ausführung in OT-Namespace-Dienstprogrammen sowie in einer Vielzahl von Session-, Publisher- und Subscriber-APIs. Damit haben Sie folgende Möglichkeiten:
- Ersetzen Sie verschachtelte Callbacks durch
async/await - Fehler mit Standardverfahren behandeln
try/catch - Die Abläufe beim Veröffentlichen und Abonnieren von Sequenzen übersichtlicher darstellen
- Führen Sie die Migration schrittweise durch, da die Callback-Signaturen aus Gründen der Abwärtskompatibilität weiterhin verfügbar bleiben.
Es gibt zwei Migrationsmuster:
- Direkte Rückgabe bei Versprechen: Verwenden Sie dies, wenn die Methode selbst ein Promise auflöst oder ablehnt. Beispiel:
const devices = await OT.getDevices() .promiseHelfer: Verwenden Sie dies, wenn die alte Methode weiterhinSession,Publisher, oderSubscriber, und die Promise-API wird für die Methode als.promise(...)Hilfsfunktion. Beispiel:await session.connect.promise(token)
Anmerkung: Ereignis-Listener ändern sich nicht. Verwenden Sie sie weiterhin. session.on(...), publisher.on(...)und subscriber.on(...) für asynchrone Ereignisse.
Was sich geändert hat
Die Umstellung auf Promisification erfolgte schrittweise:
- OT-Namespace-Dienstprogramme wie Gerätesuche, Überprüfung der Bildschirmfreigabefunktionen und Fehlermeldung
- Hilfsfunktionen für den Sitzungslebenszyklus und die Moderation
Session.publish()undSession.subscribe()- Publisher-Statistiken und APIs zur Publisher-Steuerung
- Abonnentenstatistiken und APIs zur Abonnentensteuerung
In der Praxis bedeutet dies, dass der Großteil des Codes für Abschluss-Handler in einem Web-Client nun mithilfe von Promises umgeschrieben werden kann.
Migrationsstrategie
- Konvertieren Sie die Funktion, die Ihren Vonage Video API-Ablauf verwaltet, in
async. - Ersetzen Sie die Abschluss-Handler durch
await. - API-Aufrufe in
try/catch. - Verwenden Sie ereignisgesteuerten Code als Ereignisse.
- Verwenden Sie die
.promiseForm, wenn die alte Methode weiterhin ein Objekt für die Verkettung zurückgibt.
Typisches Vorher-Nachher-Muster
Callback-basierter Ablauf
const session = OT.initSession(apiKey, sessionId);
session.connect(token, function(connectError) {
if (connectError) {
console.error(connectError);
return;
}
const publisher = OT.initPublisher('publisher', publisherOptions, function(publisherError) {
if (publisherError) {
console.error(publisherError);
return;
}
session.publish(publisher, function(publishError) {
if (publishError) {
console.error(publishError);
}
});
});
});
Promise-basierter Ablauf
async function joinAndPublish() {
const session = OT.initSession(apiKey, sessionId);
try {
await session.connect.promise(token);
const publisher = await OT.initPublisher.promise('publisher', publisherOptions);
await session.publish.promise(publisher);
} catch (error) {
console.error(error.name, error.message);
}
}
APIs, die direkt ein „Promise“ zurückgeben
Diese APIs lassen sich migrieren, indem man den Completion-Handler entfernt und direkt auf das Ergebnis wartet.
OT-Namensraum
| Callback-Stil | „Promise“-Stil |
|---|---|
OT.getDevices(function(error, devices) { ... }) |
const devices = await OT.getDevices() |
OT.checkScreenSharingCapability(function(response) { ... }) |
const response = await OT.checkScreenSharingCapability() |
OT.reportIssue(function(error, issueId) { ... }) |
const issueId = await OT.reportIssue() |
Beispiel:
try {
const capability = await OT.checkScreenSharingCapability();
if (!capability.supported) {
console.warn('Screen sharing is not supported in this browser.');
return;
}
const devices = await OT.getDevices();
console.log(devices);
} catch (error) {
console.error(error.name, error.message);
}
Session-APIs
| Callback-Stil | „Promise“-Stil |
|---|---|
session.signal(options, function(error) { ... }) |
await session.signal(options) |
session.forceDisconnect(connection, function(error) { ... }) |
await session.forceDisconnect(connection) |
session.forceUnpublish(stream, function(error) { ... }) |
await session.forceUnpublish(stream) |
Die folgenden Session-Methoden geben ebenfalls direkt Promises zurück:
session.disconnect()session.disableForceMute()session.forceMuteStream(stream)session.forceMuteAll(excludedStreams)session.setEncryptionSecret(secret)session.setIceConfig(iceConfig)
Publisher-APIs
| Callback-Stil | „Promise“-Stil |
|---|---|
publisher.getStats(function(error, stats) { ... }) |
const stats = await publisher.getStats() |
Die folgenden Publisher-Methoden geben ebenfalls direkt Promises zurück:
publisher.publishCaptions(value)publisher.cycleVideo()publisher.setAudioSource(audioSource)publisher.setVideoSource(videoSourceId)publisher.setVideoContentHint(hint)publisher.setPreferredFrameRate(frameRate)publisher.setPreferredResolution(resolution)publisher.setMaxVideoBitrate(bitrateBps)publisher.setVideoBitratePreset(preset)publisher.setVideoMediaProcessorConnector(connector)publisher.setAudioMediaProcessorConnector(connector)
Abonnenten-APIs
| Callback-Stil | „Promise“-Stil |
|---|---|
subscriber.getStats(function(error, stats) { ... }) |
const stats = await subscriber.getStats() |
Die folgenden Subscriber-Methoden geben ebenfalls direkt Promises zurück:
subscriber.subscribeToCaptions(value)subscriber.setPreferredFrameRate(frameRate)subscriber.setPreferredResolution(resolution)subscriber.setCaptionsTranslationLanguage(langCode)subscriber.setVideoMediaProcessorConnector(connector)subscriber.setAudioMediaProcessorConnector(connector)
APIs, die … verwenden .promise
Einige Methoden behalten ihren bisherigen Rückgabewert bei, sodass bestehender Code mit Kettenaufrufen weiterhin funktioniert. Verwenden Sie die .promise Eine Hilfe, wenn Sie auf den Abschluss warten müssen.
OT-Namensraum
| Callback-Stil | „Promise“-Stil |
|---|---|
OT.initPublisher(targetElement, properties, callback) |
const publisher = await OT.initPublisher.promise(targetElement, properties) |
Session-Helfer
| Callback-Stil | „Promise“-Stil |
|---|---|
session.connect(token, callback) |
await session.connect.promise(token) |
session.publish(publisher, callback) |
await session.publish.promise(publisher) |
session.publish(targetElement, properties, callback) |
const publisher = await session.publish.promise(targetElement, properties) |
session.subscribe(stream, targetElement, properties, callback) |
const subscriber = await session.subscribe.promise(stream, targetElement, properties) |
Hilfsmittel für Verlage
| Callback-Stil | „Promise“-Stil |
|---|---|
publisher.publishAudio(value) |
await publisher.publishAudio.promise(value) |
publisher.publishVideo(value, callback) |
await publisher.publishVideo.promise(value) |
Hilfsmittel für Abonnenten
| Callback-Stil | „Promise“-Stil |
|---|---|
subscriber.subscribeToAudio(value) |
await subscriber.subscribeToAudio.promise(value) |
subscriber.subscribeToVideo(value) |
await subscriber.subscribeToVideo.promise(value) |
subscriber.setAudioVolume(value) |
await subscriber.setAudioVolume.promise(value) |
subscriber.restrictFrameRate(value) |
await subscriber.restrictFrameRate.promise(value) |
Beispiel:
try {
await publisher.publishAudio.promise(false);
await publisher.publishVideo.promise(true);
const subscriber = await session.subscribe.promise(stream, 'subscriber', {
insertMode: 'append',
width: '100%',
height: '100%'
});
await subscriber.subscribeToAudio.promise(true);
await subscriber.setAudioVolume.promise(40);
} catch (error) {
console.error(error.name, error.message);
}
Fehlerbehandlung
In Callback-basiertem Code werden Fehler in der Regel als erstes Argument an den Completion-Handler übergeben. In Promise-basiertem Code werden dieselben Fehler als abgelehnte Promises zurückgegeben.
try {
const stats = await subscriber.getStats();
console.log(stats);
} catch (error) {
console.error(error.name);
console.error(error.message);
}
Dadurch lässt sich ein einziges try/catch Block für eine Abfolge zusammenhängender Vorgänge.
Schrittweise Einführung
Sie müssen nicht die gesamte Anwendung in einem Durchgang migrieren. Ein empfohlener Ansatz ist folgender:
- Beginnen Sie mit den Abläufen „Verbindung herstellen“, „Veröffentlichen“ und „Abonnieren“
- Als Nächstes die Moderations- und Signalisierungs-Helper migrieren
- Den Steuerungscode für Publisher und Subscriber zuletzt migrieren
Da die Callback-Kompatibilität weiterhin gewährleistet ist, können Sie jeweils nur einen Codepfad auf einmal umstellen.
Hinweise zur Kompatibilität
OT.initSession()gibt immer noch einSessionsynchron.session.unpublish()undsession.unsubscribe()bleiben weiterhin Helfer beim sofortigen Abbau.- Ereignis-Listener wie beispielsweise
streamCreated,sessionDisconnectedundvideoDisabledbleiben ereignisgesteuert. - Falls Ihre Anwendung ältere SDK-Versionen unterstützen muss, behalten Sie die Callback-Formular-Methode bei, bis alle bereitgestellten Clients auf eine Version aktualisiert wurden, die diese Promise-APIs enthält.
Nächste Schritte
- Überprüfen Sie die JavaScript-Sitzungsreferenz, Verlagsangabeund Abonnentenreferenz für methodenspezifische Einzelheiten.
- Die Anwendungstests so aktualisieren, dass sie
awaitPromise-basierte APIs, anstatt sich auf die Ausführung von Callbacks zu verlassen. - Bevorzugen
asyncBeim Schreiben von neuem Code ziehe ich Hilfsfunktionen den verschachtelten Callbacks vor.