How about
stoppable (task: Promise): Promise {
return new Promise((resolve, reject) => {
task.catch(e => reject(e));
task.then(value => {
// check component destroyed state or use any other condition to stop coroutines
if (this.isValid) {
resolve(value);
}
else {
// DONT CALLBACK
}
});
});
}
async start () {
await foo(); // unstoppable
console.log('output');
await stoppable(bar);
console.log('never output if destroyed');
}
You can even write a decorator, like
@stoppable
async foo () {
}
async start () {
await foo();
console.log('never output if destroyed');
}

