angularjs - Håndtering av ES6/2015-løfter i Typescript med en Angular 1-app


Vi har en Angular 1.5-applikasjon bygget med Typescript, og jeg prøver å finne den beste måten å håndtere ng.IPromise vs Promise (ES6 promise). Min preferanse ville være å bare håndtere ES6 Promise-typen. Finnes det en elegant måte å overstyre alle angular-js og angular-material (også inkludert) grensesnitt for å bruke ES6 promises?

Alternativer jeg kan komme på:

  1. Bruk litt d.ts-magikk for å gjøre dette (kan det gjøres?)
  2. Kast til ES6 Promise overalt (fungerer, men ikke intuitivt)
  3. Bidra til åpen kildekode, forke typene for ng og ng material, og få dem til å returnere typen ES6 Promise (jeg burde sannsynligvis bare gjøre dette, men er ikke sikker på om jeg har tid til et kaninhull akkurat nå)

Klarifisering

Den underliggende Promise-implementeringen som brukes av Angular-applikasjonen, er fortsatt $q (selv om jeg også bruker angular-bluebird-promises). Jeg prøver bare å forenkle/konsolidere Typescript-grensesnittene som er involvert.

Svar #1

Det er veldig gode grunner til at de bør forbli to forskjellige grensesnitt.

Det er grunnleggende forskjeller mellom $q-løfter og andre implementasjoner. $q-kjeden kan være synkron og kjører på digest. Dette gjelder ikke for andre løfter (nemlig native Promise).

I en TS/ES6-applikasjon hvor native og $q-promiser eksisterer side om side, kan Promise og ng.IPromise-grensesnitt aggregeres til en fellesnevner som passer begge, f.eks. IPromise (uten ng). Men det gir veldig lite mening. Utilsiktet bruk av native promise i en kodebit som forventer $q-promise (og omvendt) er det siste man ønsker å gjøre, men det vil ikke bli forhindret av Typescript dersom felles IPromise brukes.

Hvis løftet forventes å bli eksportert fra Angular og brukt av kode utenfor Angular, er det foretrukket å konvertere det til Promise, som det andre svaret antyder.

For gitt ikke-vinklet kontekst

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

dette

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

vil utløse then-tilbakekalling på neste tick. Og dette

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

vil pause kjeden til neste rotomfang digest, selv om then har blitt koblet til en løst løfte.

Selv om det ikke er relevant for TS, er dette spørsmålet et godt eksempel på hvorfor det er viktig å alltid være klar over om det er $q eller en native promise som brukes.

Svar #2

Finnes det en elegant måte å overstyre alle AngularJS- og Angular Material-grensesnitt (også inkludert) for å bruke ES6-løfter på

Vi gikk bare med IPromise overalt. Det er vanskelig å erstatte IPromise med Promise på grunn av underliggende implementasjonsforskjeller. Du vil ha det bedre med å gjøre Promise.resolve(someIPromise) hvis du vil, men da ville det ikke fungere med Angular.

Relaterte artikler