Я думаю, что 1. это просто путь к go на Svelte. Нет ngOnChanges
, как в angular.
2. / 3. Я думаю, это не зависит от Svelte. Асинхронные вещи с гонками времени всегда сложны. Такие библиотеки, как rxjs
, облегчают эту задачу, но имеют крутую кривую обучения. Пример:
<script>
import { interval, Subject } from 'rxjs';
import { switchMap, take, map, startWith, tap } from 'rxjs/operators';
const cache = {};
const id$ = new Subject();
const progress$ = id$.pipe(
// every time id$ gets a new id, start new interval
switchMap(id => {
return interval(1000).pipe(
// every time the interval emits, do an api call
switchMap(() => {
// fake api call
return interval(200).pipe(
take(1),
map(() => id + '::' + Math.random()),
// store value in cache
tap(value => cache[id] = value)
);
}),
// start with cached value
startWith(cache[id]),
);
})
);
let id = 1;
function switchPoll() {
id = id === 2 ? 1 : 2;
id$.next(id);
}
</script>
<p>{$progress$}</p>
<button on:click={switchPoll}>Switch</button>