Angular/TypeScript - Kall en funksjon etter at en annen er fullført
Jeg vil gjerne kalle f2 etter at f1 har blitt fullført. f1-funksjonen kan være synkron eller asynkron. Jeg trenger et eksempel som fungerer i begge tilfeller. Jeg har funnet en løsning, ved å bruke en Promise og en timer:
global() {
this.f1().then(res => {
this.f2()
})
}
f1() {
return new Promise<any>((resolve, reject) => {
// Some code...
setTimeout( () => {
resolve(x);
}, 1500);
});
}
f2() {
// Some code...
}
Problemet er at programmet alltid må vente 1500ms. Jeg vil ikke at f2 skal starte før f1 er ferdig. Finnes det en måte å vente nøyaktig den tiden som trengs, ikke mer eller mindre?
Svar #1
Så fjern setTimeout-delen. Den vil kalle resolve eller reject og deretter sende utførelsen videre til neste then eller catch-håndterer. Hvis du har et asynkront kall i Promise, må du kalle resolve/reject i resultatet av det kallet.
Hva med å ikke vente 1500ms - den angitte tiden er faktisk den laveste tiden etter hvilken funksjonen kan kalles. Kanskje etter 2000ms. Dette er relatert til hovedtråden der JS-koden kjører. Hvis hovedtråden ikke har noe arbeid å gjøre, vil resultatene av de asynkrone kallene bli utført.
function f1() {
return new Promise((resolve, reject) => {
console.log('f1');
resolve();
});
}
function f2() {
console.log('f2');
}
f1().then(res => f2());Svar #2
Hvis
f1er synkron, er det ingenting spesielt å gjøre:
global() {
f1();
f2();
}
Hvis
f1er asynkron og returnerer en Observable, brukRxjs-operator, som concatMap:
global() {
f1().concatMap(() => f2());
}
Hvis
f1er asynkron og returnerer et Promise, brukasync/await:
async global() {
await f1();
f2();
}
Hvis
f1er asynkron og returnerer et Promise (alternativ):
global() {
f1().then(res => f2());
}
