2017-10-07 3 views
3

Ich begann ein neues Projekt, wo ich TypeScript anstelle von reinem Javascript verwenden möchte. Ich habe Probleme mit Bluebird in Verbindung mit Bibliotheken von Drittanbietern.Bluebird und es6 verspricht in typescript

Siehe das folgende Beispiel:

import * as Promise from 'bluebird' 

    private requestPlayerProfile(playerTag:string):Promise<IPlayerProfile> { 
    const requestOptions = Object.create(this.options)  
    return this.limiter.schedule(request, requestOptions) 
    } 

Das Problem: limiter ist eine Instanz eines Dritten Bibliothek und limiter.schedule liefert eine native Versprechen offenbar, während ich die Drossel Versprechen in den Rest bin mit meiner Bewerbung. Wie würde ich solche Fälle richtig behandeln?

[ts] Typ 'Promise' ist nicht dem Typ 'Bluebird' zuweisbar. Arten der Eigenschaft 'dann' sind inkompatibel.

+1

Es hängt von der Art von Promise ab, die die von Ihnen verwendete Bibliothek zurückgibt. Wenn es ein Vanilleversprechen zurückgibt, können Sie entweder manuell von einem zum anderen mappen oder einfach die nativen Promises anstelle von Bluebirds verwenden. –

+0

Was ist ein Vanilleversprechen? Ich denke, es gibt ein natives ES6-Versprechen und wenn ich das native Promise verwende, müsste ich buchstäblich native Promises überall verwenden oder? Daher müssen alle Routen/Funktionen, die die Funktion requestPlayerProfile aufrufen, auch mit Bluebird arbeiten. Lässt mich Bluebird nicht wirklich überzeugen, wenn ich ständig native und bluebird Promises mischen muss? – kentor

Antwort

3

@Filipe interpretiert die Fehlermeldung korrekt.

  • der Typ des Objekts Unabhängig von this.limiter.schedule(...) zurückgeführt wird, ist dieser Typ mit bluebird.Promise<IPlayerProfile> inkompatibel.
  • Niemand kann zuverlässig annehmen, dass limiter.schedule(...) ein "vanila", d. H. Ein natives, Promise<IPlayerProfile> Objekt zurückgibt. Sie können es leicht herausfinden, indem Sie zum Quellcode gehen, in dem schedule(...) definiert ist. In meinem Visual Studio Code verwende ich F12 um dorthin zu gelangen. Beachten Sie den genauen Rückgabetyp des Objekts dort.
  • Je nachdem, was genau zurückgeführt wird, haben Sie zwei wichtige Optionen:
    1. verwenden, die stattdessen in Ihrem Code eingeben überall versprechen ganz auf bluebird ‚s Versprechen zu verlassen; oder
    2. Convert that promise type to a bluebird one. Ich habe es selbst nicht versucht, aber Folgendes sollte funktionieren: return Promise.resolve(this.limiter.schedule(request, requestOptions)) (siehe http://bluebirdjs.com/docs/api/promise.resolve.html).

Ich hoffe, es hilft.