2016-11-16 3 views
8

Ich beobachte, dass in Winkel 2 kein schließlich für Versprechen APIschließlich in Winkel 2 Versprechen blockieren

Winkel Block 1 ist:

loadUsers() { 
    fetch('/api/users').then((response) => { 
    return response.json(); 
    }).then((data) => { 
    this.users = data; 
    }).catch((ex) => { 
    console.error('Error fetching users', ex); 
    }).finally(() => { 
    this.userLoaded = true; 
}; 

I elbe in Winkel 2

zu tun Unter der Annahme haben

Wie Sie endlich Block in Winkel 2 Versprechen, ab sofort gibt es nur then & catch blocks in eckigen 2. Wenn nicht endlich dann gibt es eine Möglichkeit, Reinigungscode nach der Ausführung jeder Methode, wo schreibe ich co zu tun, um endlich Aktivitäten zu blockieren?

+0

Haben Sie sich mit Observablen anstelle von Versprechungen beschäftigt? – jonrsharpe

+0

In Zukunft: 'angularjs' ist für AngularJS 1.x Fragen. –

+0

@jonrsharpe Dies mag eine rechthaberische Aussage sein, aber ich glaube, Observablen lösen nicht die gleiche Problemdomäne wie Versprechungen. – Katana314

Antwort

1

Dies wird normalerweise mit Promise.always durchgeführt. Dies nimmt eine Funktion an und fügt eine neue .then zu dem Versprechen hinzu, das die gleiche Funktion für Erfolgs- und Fehlerstatus gibt. Wenn die Funktion in der gegebenen Versprechen basierte Umgebung nicht verfügbar ist, ist es ziemlich einfach, POLYfill

Promise.always = function(p, fn) { 
    return p.then(fn, fn); 
} 

Nutzung:.

var prom = fetch('/api/users').then... 
Promise.always(prom,() => { 
    this.userLoaded = true; 
}); 
return prom; 
+0

Sie sollten das 'Promise'-Objekt ** nicht ** ändern. https://www.nczonline.net/blog/2010/03/02/maintainable-javascript-dont-modify-objects-you-down-own/ –

9

Der einfachste Weg, dies zu tun ist, um die promise.finally shim zu verwenden.

  • es hinzufügen mit npm install --save promise.prototype.finally
  • hinzufügen die Typisierungen: npm install --save-dev @types/promise.prototype.finally
  • in der Hauptklasse, bevor Sie die Anwendung Bootstrapping, fügen Sie den folgenden Code ein:
import { shim } from 'promise.prototype.finally'; 
shim(); 

Sie sollten nun in der Lage sein, um finally auf Ihre Versprechen zu verwenden.

+0

Ich bekomme einen Fehler mit Typoskript 2.1.5 sagen alle Versprechen Versprechen muss eine identische Erklärung haben. –

+0

@ShyamalParikh glücklicherweise wurde das DefinitelyTyped Repo mit den korrekten Typings aktualisiert. Ich habe meine Antwort oben aktualisiert, um dies zu berücksichtigen. – fiznool

+1

@fiznool, Danke dafür. Eine Sache, die hinzugefügt werden muss (ich benutze Angular4) Ich denke, es ist am besten, die Unterlegscheibe in die Datei polpfills.ts zu legen. Ich habe am Ende dieser Datei folgendes eingefügt: '/ ************************************** ************************************************** *********** * VERSPRECHEN .finally SHIM */' ' import {shim als finallyShim} von 'promise.prototype.finally'; finallyShim(); ' – PigBoT