#質問
JavaScriptで、逐次的・非同期なsleep(またはwait)っぽいプロシージャは実現できないでしょうか。
#期待する動作
JavaScript
1function func() { 2 console.log("2"); 3 sleep(3000); 4 console.log("3"); 5}; 6 7console.log("1"); 8func(); 9console.log("4");
のように記述すると、
(起動直後...)
1 2
(3秒後...)
3 4
のように出力されるように動作し、かつ3秒の待ち時間の間はビジー状態にならないようなsleepプロシージャを実現したいです。
#問題点
逐次的なsleepを愚直に実装すると、スクリプトから処理が戻らずビジー状態が継続され、画面が固まってしまうようです。
非同期なsleepを愚直に実装すると、setTimeoutの後の処理が先に行われてしまいます。
解決するための手段として、promiseと言う機能が用意されているようですが、コールスタックが呼び出し元に返った時、その先の処理は先に行われてしまうようです。
promiseの挙動は把握仕切れていませんが、おそらくこれを解決するのは無理っぽいように感じました。
呼び出し元で後に行いたい処理を呼び出し先に移すとか、コールバック関数を渡すとかで無理矢理実現することもできるのですが、(Javaで言う処の)publicを増やさないといけないとか、引数を増やさないといけないとかで、カプセル化や疎結合性が壊れてしまいます。
#解決へのアイディア
sleepが呼ばれた時コールスタックを保存し、一旦ビジー状態を解除。その後timeoutプロシージャが呼ばれたらスタックの状態を復元し、そこから処理を再開。
つまり、コールスタックの状態を保存・復元できるような機能があればこれは解決できるように思いますが、こういった処理は用意されているのでしょうか。他の実現方法でも構いませんが。
#開発環境
Nim(Compiler Version 0.20.0 [MacOSX: amd64])と言うコンパイル言語で、中間コードとしてJavaScriptソースを生成しています。
この言語にはdomを操作する標準ライブラリが用意されていて、
ほとんど任意の処理に対して、JavaScriptで実現可能 ⇔ Nimで実現可能
と言う感じになっています。
Nimはマイナーな言語ですので、このようなJavaScriptメインの質問形式にさせていただきました。
Nimの方は全く知らなくても問題ないです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/12 02:17
退会済みユーザー
2019/08/12 05:36
退会済みユーザー
2019/08/12 05:37
退会済みユーザー
2019/08/12 05:39
2019/08/12 05:46
2019/08/12 06:01
2019/08/12 06:15
2019/08/12 06:18
退会済みユーザー
2019/08/13 04:21
2019/08/13 08:03
2019/08/13 09:11
退会済みユーザー
2019/08/13 09:53