异步扩展破坏了 GNOME Shell

问题描述

我做了一个简单的异步扩展,它会定期计算 Arch Linux 的更新并将它们显示在面板上。

该扩展程序运行良好如果 Gnome Shell 已在运行中启用它。在任何其他情况下(在预启用扩展的情况下启动 Gnome Shell),它会破坏桌面并返回 GDM。

我的代码可以在:https://github.com/speltriao/Pacman-Update-for-GNOME-Shell/blob/main/pacmancounter@example.com/extension.js

也许 async 函数有问题?来自https://www.andyholmes.ca/articles/asynchronous-programming-in-gjs.html

的想法

谢谢。

解决方法

我建议先通读review guidelines,以及extension guides

在函数 countUpdates() 中,您正在创建一个嵌套的 GLib.MainLoop,它在运行时会阻塞 GNOME Shell 已经在运行的现有主循环(有点违背异步操作的目的)。我完全不清楚嵌套主循环在 GJS 中是如何工作的,除非您很清楚,否则我通常不会这样做。

另外,如果异步函数失败,嵌套的主循环永远不会退出,这会无限期地挂起 GNOME Shell。很有可能导致 GNOME Shell 在启动过程中崩溃。