Ниже приведен простой сценарий для некоторого расширения GNOME:
- Включите расширение. Расширение — это класс, расширяющий
Clutter.Actor
. - Он создает актера с именем
myActor
и добавляет его:this.add_child(myActor)
. - Затем он вызывает асинхронную трудоемкую функцию
this._tcFunction()
, которая в конце концов что-то делает сmyActor
.
Вот тут я столкнулся с проблемой:
Отключаем (запускаем
this.destroy()
) расширение сразу после включения.При отключении
this.destroy()
запускаетthis.run_dispose()
GObject для сбора мусора. Однако, еслиthis._tcFunction()
не закончил работу, позже он попытается получить доступ кmyActor
, который, возможно, уже был освобожденthis.run_dispose()
.
Один из способов сделать это — определить логическую переменную в this.destroy()
.
destroy() {
this._destroying = true
// ...
this.run_dispose;
}
а затем добавьте проверку в this._tcFunction()
, например.
async _tcFunction() {
await this._timeConsumingStuff();
if (this._destroying === true) { return; }
myActor.show();
}
Мой вопрос: есть ли лучший способ справиться с этими ситуациями? Может с Gio.Cancellable()
? Насколько я знаю, нет простого способа остановить асинхронную функцию в javascript...