2016-11-16 19 views
8

Obserwuję, że w kątowym 2 nie ma w końcu zablokować za obietnicę APIwreszcie zablokować w kątowym 2 obietnicy

kątowa 1:

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; 
}; 

Zakładając, muszę zrobić to samo w kątowa 2

Jak dodać blok końcowy w kanciastej 2 obietnicy, od tej chwili są dostępne tylko then & catch blocks w kanciastym 2. Jeśli nie w końcu, to czy istnieje sposób dodania kodu oczyszczania po wykonaniu każdej metody, gdzie mogę napisać co de w końcu zablokować działania?

+0

Czy rozważałeś użycie obserwowalnych zamiast obietnic? – jonrsharpe

+0

W przyszłości: 'angularjs' jest dla pytań AngularJS 1.x. –

+0

@jonrsharpe To może być oświadczenie uparte, ale uważam, że obserwowalne nie rozwiązują tej samej dziedziny problemowej, co obietnic. – Katana314

Odpowiedz

1

Zazwyczaj robi się to za pomocą Promise.always. Ma to jedną funkcję i dodaje nową .then na obietnicy, która daje tę samą funkcję zarówno dla stanów sukcesu, jak i awarii. Jeśli funkcja nie jest dostępna w danym środowisku obietnicy oparte, to całkiem łatwe do PolyFill w

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

wykorzystanie.

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

Powinieneś ** nie ** modyfikować obiektu 'Promise'. https://www.nczonline.net/blog/2010/03/02/maintainable-javascript-dont-modify-objects-you-down-own/ –

9

Najprostszym sposobem, aby to zrobić jest użycie promise.finally shim.

  • Dodaj go npm install --save promise.prototype.finally
  • dodać typowania: npm install --save-dev @types/promise.prototype.finally
  • W swojej głównej klasie, przed ładowanie początkowe aplikację, dodaj następujący kod:
import { shim } from 'promise.prototype.finally'; 
shim(); 

Teraz powinno być w stanie aby użyć finally w sprawie swoich obietnic.

+0

Otrzymuję błąd z maszynopisem 2.1.5, który mówi o wszystkich deklaracjach obietnicy musi mieć identyczną deklarację. –

+0

@ShyamalParikh na szczęście repozytorium DefinitelyTyped zostało zaktualizowane poprawnymi typami. Zaktualizowałem powyższą odpowiedź, aby to odzwierciedlić. – fiznool

+1

@fiznool, dzięki za to. Jedna rzecz do dodania (używam Angular4) Myślę, że najlepiej jest umieścić podkładkę w pliku polyfills.ts. Na samym dole tego pliku umieściłem następujący tekst: '/ *********************************** ******************************************* *********** * OBIETNICE .finally SHIM */' ' import {shim as finallyShim} from 'promise.prototype.finally'; finallyShim(); ' – PigBoT

Powiązane problemy