2016-06-30 8 views
3

Wir haben eine Angular 1.5-Anwendung mit Typescript gebaut, und ich versuche herauszufinden, die beste Art, mit ng.IPromise vs Promise (ES6 Versprechen) umzugehen. Meine Vorliebe würde sein, nur mit dem ES6 Promise-Typ umzugehen. Gibt es eine elegante Möglichkeit, alle angular-js und angular-material (auch im Lieferumfang enthaltenen) Interfaces zu übersteuern, um es6 Versprechen zu nutzen?Verwalten von ES6/2015 Versprechen in Typescript mit einer Angular 1-App

Optionen kann ich mich vorstellen: (es kann getan werden)

  1. einig d.ts Magie verwenden, dies zu tun
  2. Cast ES6 Versprechen überall (Arbeiten, aber nicht intuitiv)
  3. beitragen Quelle zu öffnen, Gabel, welche die Typisierungen für ng und ng Material, und sie Art von ES6 Versprechen zurückzukehren (ich wahrscheinlich dies nur tun sollte, aber nicht sicher, ich habe Zeit für einen Kaninchenbau jetzt) ​​

Erläuterung

Die zugrundeliegende Promise-Implementierung, die von der eckigen Anwendung verwendet wird, ist immer noch $ q (obwohl ich auch Angular-Bluebird-Versprechungen anwende). Ich versuche nur, die beteiligten Typescript-Schnittstellen zu vereinfachen/zu konsolidieren.

+0

$ q Versprechen sollten nicht blind durch native Versprechungen ersetzt werden, da es grundlegende Unterschiede zwischen ihnen gibt. Sie sind verschiedene Dinge. $ q chain kann synchron sein und läuft auf Digest. Dies gilt nicht für andere Versprechensimplementierungen. – estus

+0

Ich verwende immer noch $ q verspricht (Klarstellung hinzugefügt) – Ken

+0

Dann sollten sie zwei verschiedene Schnittstellen bleiben, weil sie auf verschiedene Konstruktoren beziehen. Das haben andere ... Schnittstellen. Sie können sie zu einem gemeinsamen Nenner zusammenfassen, z. IPromise, weil in ES6/TS App $ q und native Versprechungen koexistieren können. Aber es macht sehr wenig Sinn. Versehentliches Verwenden von nativen Versprechen in einem Codeabschnitt, der $ q promise erwartet, ist das Letzte, was Sie tun möchten. Also nochmal, diese Schnittstellen sollten nicht gemischt werden – estus

Antwort

2

Es gibt sehr gute Gründe, warum sie zwei verschiedene Schnittstellen bleiben sollten.

Es gibt grundlegende Unterschiede zwischen $q Versprechen und anderen Implementierungen. $q Kette kann synchron sein und läuft auf Digest. Dies gilt nicht für andere Versprechen (nämlich native Promise).

In TS/ES6 Anwendung, wo einheimische und $q Versprechen koexistieren, Promise und ng.IPromise Schnittstellen können auf gemeinsame Nenner zusammengefasst werden, die beide von ihnen passen, z.B. IPromise (ohne ng). Aber es macht sehr wenig Sinn. Versehentliche Verwendung von nativen Versprechen in einem Stück Code, der $q Versprechen (und umgekehrt) erwartet, ist das letzte, was Sie tun möchten, aber es wird nicht durch Typescript verhindert, wenn gemeinsame IPromise verwendet wird.

Wenn erwartet wird, dass das Versprechen aus Angular exportiert und durch nicht-eckigen Code verwendet wird, ist es vorzuziehen, es in Promise umzuwandeln, wie die andere Antwort vorschlägt.

Für gegebene nicht-Angular Zusammenhang

let exportedPromise = getResolvedPromise(); 
... 
exportedPromise.then(...); 

diese

function getResolvedPromise() { 
    return Promise.resolve($q.resolve()); 
}; 

then Rückruf bei nächsten Tick ausgelöst.Und die

function getResolvedPromise() { 
    return $q.resolve(); 
}; 

wird die Kette bis zum nächsten Stammbereich verdaut Pause, obwohl then auf aufgelöste Versprechen gekettet ist.

Obwohl es für TS nicht relevant ist, ist this question ein gutes Beispiel, warum es wichtig ist, immer zu wissen, ob es $q oder natives Versprechen ist, das verwendet wird.

2

Gibt es eine elegante Art und Weise alle Winkel js und Winkelmaterial außer Kraft zu setzen Schnittstellen (auch im Lieferumfang enthalten) es6 Versprechen

Wir mit IPromise überall ging einfach zu bedienen. Es ist schwer zu ersetzen IPromise mit Promise aufgrund der zugrunde liegenden Implementierungsunterschiede. Sie würden besser tun Promise.resolve(someIPromise), wenn Sie möchten, aber dann würde es nicht mit eckigen spielen.

+0

Innerhalb der eckigen App mache ich das. Wo die Dinge nicht intuitiv werden, ist die Verwendung externer (nicht angularspezifischer) Bibliotheken, die auf die es6 Promise Typescript-Schnittstelle verweisen. – Ken