Spaces:
Sleeping
Sleeping
File size: 1,825 Bytes
7aec436 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
import {EventTarget} from '../common/event-target';
import {AbortError} from '../common/errors';
import {progress, error, currentTask} from './stores';
class Task extends EventTarget {
constructor () {
super();
this.aborted = false;
progress.reset();
progress.update((p) => {
p.visible = true;
return p;
});
currentTask.replace(this);
}
abort () {
if (!this.aborted) {
this.aborted = true;
this.dispatchEvent(new Event('abort'));
}
}
error (e) {
if (!this.aborted) {
error.set(e);
progress.reset();
this.abort();
}
}
setProgress (percent) {
if (!this.aborted) {
progress.update((p) => {
p.progress = percent;
return p;
});
}
}
setProgressText (text) {
if (!this.aborted) {
progress.update((p) => {
p.text = text;
return p;
});
}
}
whenAbort (callback) {
this.addEventListener('abort', callback);
if (this.aborted) {
callback();
}
}
do (promise) {
if (this.aborted) {
return Promise.reject(new AbortError());
}
return new Promise((resolve, reject) => {
const abortCallback = () => {
reject(new AbortError());
};
this.addEventListener('abort', abortCallback);
promise
.then((r) => {
resolve(r);
this.removeEventListener('abort', abortCallback);
})
.catch((e) => {
reject(e);
this.error(e);
this.removeEventListener('abort', abortCallback);
});
});
}
done () {
progress.update((p) => {
p.visible = false;
return p;
});
currentTask.set(null);
}
}
export default Task;
|