ES6 には Promise という非同期関数がある。
Promiseと仲良くなって気持ち良く非同期処理を書こう – Qiita
なるほど、Promise 関数と then 関数を使えばいいのか。
てなわけで、毎度のようにコイツで GUI アプリを起動してみよう。
#!/usr/bin/gjs
const GLib = imports.gi.GLib;
function asyncFunction(guiApp) {
return new Promise(function (resolve, reject) {
print("__DO__");
GLib.spawn_command_line_sync(guiApp);
resolve("__DONE__");
});
}
asyncFunction("eog")
.then(function (value) {
print(value);
})
.catch(function (error) {
print(error);
});
print("__EOL__");
だめヤン!
非同期ならこの状態で __EOL__ まで抜けているはずだ。
で、昨日気が付いたんだけど思い込みによる勘違いだった。
非同期になるのは Promise 関数内ではなく then 関数内であるようだ。
#!/usr/bin/gjs
const GLib = imports.gi.GLib;
function asyncFunction() {
return new Promise(function (resolve, reject) {
resolve(null);
});
}
print("__START__");
asyncFunction()
.then(function (value) {
GLib.spawn_command_line_sync("eog");
});
print("__EOL__");
コレなら __EOL__ まで抜けているのにアプリは実行されたままになる。
GUI アプリを起動するコードだと動作を把握しやすい、Linux の長所。
んで、実は単純な非同期処理なら省略表記があって。
#!/usr/bin/gjs
const GLib = imports.gi.GLib;
Promise.resolve(null).then(function (value) {
GLib.spawn_command_line_sync("eog");
});
print("__EOL__");
以上。
超シンプルな非同期処理のできあがり。
Promise 関数は前処理で then が非同期の実行という解釈でいいかな。
前処理(確認作業)が不要なら省略表記で、と使い分けできるね。
アロー関数を使えばクラスメソッドも問題なく使えるようだ。
#!/usr/bin/gjs
const GLib = imports.gi.GLib;
class PromiseTest {
get command() {return this._command;}
set command(cmd) {this._command = cmd;}
asyncFunc() {
Promise.resolve(null).then((value)=> {
GLib.spawn_command_line_sync(this.command);
});
}
}
let test = new PromiseTest();
test.command = "evince";
test.asyncFunc();
print("__EOL__");
ES6 フル活用!
えぇ… JavaScript !!!
と記法で超嫌っていた JavaScript が今ではこんなに面白いとは予測できなかったYO!