2017-03-22 1 views
1

manchmal in can In JavaScript passiert nützlich seine Promise.all zu verwenden, um einige Bit an Daten in einer Kette von asynchronen Operationen wieder zu verwenden wie so:Promise.all in Typoskript Verwenden von Werten zum nächsten Handler in der Kette

logMeIn() 
.then(token => { 
    return Promise.all([ 
    token, 
    fetchProfile(token) 
    ]) 
}) 
.then(([token, profile]) => { 
    return getAvatar(token, {userId: profile.id}) 
}) 
// etc... 

Wie wir sehen können, benötigt der zweite then Resolver das Ergebnis des ersten Resolvers, benötigt aber immer noch die token. Ein Weg wäre, die zweite then Anruf innerhalb der ersten zu verschachteln, aber das kann hässlich werden und in einer langen Kette ist es nicht besser, als die Callback-Hölle verspricht, wo entwickelt, um zu mildern.

Mithilfe von Promise.all() können wir Daten früherer Resolver erneut verwenden und sie in der Kette weiterleiten.

Das alles funktioniert großartig, aber Typoskript Flips, wenn Sie versuchen, und dies wie dies mit Fehlern tun:

Argument vom Typ ‚(string | Versprechen <Etwas>) []‘ nicht belegbar ist auf Parameter vom Typ 'IterableShim < Etwas | PromiseLike <Etwas> > '. Arten der Eigenschaft '"es6-shim Iterator"' sind nicht kompatibel.
Typ '() = > IterableIteratorShim < Zeichenfolge | Versprechen <Etwas> > 'ist nicht zu Typ zuordnen'() = > Iterator < Etwas | PromiseLike <Etwas> > '.

Gibt es eine Möglichkeit in TypeScript, dass das oben genannte durchgeführt werden kann, vorzugsweise unter Beibehaltung der Typensicherheit?

+0

Hinweis gibt es [viele andere Lösungen] (http://stackoverflow.com/q/28250680/1048572) für das allgemeine Problem. Unterstützt TypeScript nicht schon 'async' /' await'? – Bergi

+0

@Bergi Es tut, obwohl dieses bestimmte Muster wahrscheinlich unterstützt würde, wenn TypeScript [variadic Typen] bekommt (https://github.com/Microsoft/TypeScript/issues/5453) –

Antwort

0

können Sie versuchen, Rückgabetyp explizit angeben:

logMeIn() 
    .then<[Token, Profile]>(token => Promise.all([token, fetchProfile(token)])) 
    .then(([token, profile]) => getAvatar(token, { userId: profile.id })) 
Verwandte Themen