Sto provando a utilizzare la funzione routerCanDeactivate
per un componente nella mia app. Il modo semplice per usarlo è il seguente:Promesse Angular 2 e TypeScript
routerCanDeactivate() {
return confirm('Are you sure you want to leave this screen?');
}
Il mio unico problema è che è brutto. Utilizza solo un prompt di conferma generato dal browser. Voglio davvero usare una modal personalizzata, come un modal Bootstrap. Ho il modal Bootstrap restituendo un valore vero o falso in base al pulsante che fanno clic. Il routerCanDeactivate
che sto implementando può accettare un valore vero/falso o una promessa che si risolve in vero/falso.
ecco il codice per il componente che ha il metodo routerCanDeactivate
:
export class MyComponent implements CanDeactivate {
private promise: Promise<boolean>;
routerCanDeactivate() {
$('#modal').modal('show');
return this.promise;
}
handleRespone(res: boolean) {
if(res) {
this.promise.resolve(res);
} else {
this.promise.reject(res);
}
}
}
Quando i miei file dattiloscritto compilazione, ottengo i seguenti errori nel terminale:
error TS2339: Property 'resolve' does not exist on type 'Promise<boolean>'.
error TS2339: Property 'reject' does not exist on type 'Promise<boolean>'.
Quando provo a lascia il componente, l'avvio modale, ma poi il componente si disattiva e non aspetta che la promessa si risolva.
Il mio problema sta tentando di elaborare la Promessa in modo che il metodo routerCanDeactivate
attenda la promessa da risolvere. C'è un motivo per cui c'è un errore che dice che non c'è la proprietà 'resolve'
su Promise<boolean>
? Se riesco a elaborare quella parte, cosa devo restituire nel metodo routerCanDeactivate
in modo che sia in attesa della risoluzione/rifiuto della promessa?
Per riferimento, here is the DefinitelyTyped Promise definition. C'è chiaramente una funzione di risoluzione e rifiuto lì.
Grazie per il vostro aiuto.
UPDATE
Qui è il file aggiornato, con la promessa di essere inizializzato:
private promise: Promise<boolean> = new Promise(
(resolve: (res: boolean)=> void, reject: (res: boolean)=> void) => {
const res: boolean = false;
resolve(res);
}
);
e la funzione handleResponse
:
handleResponse(res: boolean) {
console.log('res: ', res);
this.promise.then(res => {
console.log('res: ', res);
});
}
Si continua a non funzionare correttamente, ma il modale appare e attende la risposta. Quando tu dici di lasciare, rimane sul componente. Inoltre, il primo res
registrato è il valore corretto restituito dal componente, ma quello all'interno della funzione .then
non è uguale a quello passato alla funzione handleResponse
.
ulteriori aggiornamenti
Dopo aver fatto un po 'di lettura, sembra che nella dichiarazione promise
, si imposta il valore resolve
, e il promise
ha quel valore non importa quale. Quindi, anche se in seguito chiamo il metodo .then
, non cambia il valore di promise
e non riesco a renderlo vero e cambio componenti. C'è un modo per fare in modo che promise
non abbia un valore predefinito e che debba attendere fino a quando non viene richiamato il suo metodo .then
?
funzioni Aggiornato:
private promise: Promise<boolean> = new Promise((resolve, reject) => resolve(false));
handleResponse(res: any) {
this.promise.then(val => {
val = res;
});
}
Grazie ancora per l'aiuto.
Ultimo aggiornamento
Dopo aver guardato molti suggerimenti, ho deciso di creare una classe Deferred
. Ha funzionato abbastanza bene, ma quando lo faccio la deferred.reject(anyType)
, ottengo un errore nella console di:
EXCEPTION: Error: Uncaught (in promise): null
Questa stessa cosa accade quando passo in null
, un string
, o un boolean
. Il tentativo di fornire una funzione catch
nella classe Deferred
non ha funzionato.
differita Classe
export class Deferred<T> {
promise: Promise<T>;
resolve: (value?: T | PromiseLike<T>) => void;
reject: (reason?: any) => void;
constructor() {
this.promise = new Promise<T>((resolve, reject) => {
this.resolve = resolve;
this.reject = reject;
});
}
}
potrei sbagliarmi poiché non so dattiloscritto, ma dovrebbe non prima * inizializzare * 'questo. promise'? Più precisamente, non dovresti restituire una promessa e mantenere il riferimento delle sue funzioni 'resolve' e' reject', quindi chiamarle? – Amit
@Se sei corretto, ho aggiornato il post originale. – pjlamb12
cosa sta invocando la risposta handle? –