◆ メインループ作って setTimeout だけ作ってみた

今回は メソッドにしたりプロトタイプチェーン付けたりではなく 別アプローチです

メインループです

JavaScript 使ってると sleep みたいな待機は特に必要なくなって むしろ後でやるに登録して残りを先にやってもらいたいと考えることが増えてきます
この処理は非同期にして後に回そうとか できたら…… なんておもいませんか?

思いませんよね

まあ いつもながら思いつきでやってるので実用性は気にしたら負けってやつです

コード


ライブラリ部分
[js.php]
<?php

$main_queue = [];
$main_func = function() use ($argv) {
require $argv[1];
};
array_push($main_queue, $main_func);

function afunc($fn){
global $main_queue;
array_push($main_queue, $fn);
}
function setTimeout($fn, $time, ...$args){
$exec_time = microtime(true) + $time / 1000;
$recur = function() use($fn, $args, $exec_time, &$recur){
$exec_time < microtime(true) ?
$fn(...$args) :
afunc($recur);
};
afunc($recur);
}

// main loop
while(count($main_queue)){

$fn = array_shift($main_queue);
$fn();

}

メイン部分
[test.php]
<?php

echo 1, PHP_EOL;

setTimeout(function($a){
echo $a, PHP_EOL;
}, 1000, "1000 msec");

echo 2, PHP_EOL;

setTimeout(function($a){
echo $a, PHP_EOL;
}, 200, "200 msec");

echo 3, PHP_EOL;

使い方
php js.php test.php
1
2
3
200 msec
1000 msec

afunc 関数に関数を渡すと 何もやることがなくなったらやるリストに登録します
メインの関数が終わったら そのリストを登録順に実行します

リストの実行中にもこのリストに追加することはできます

完全に何もなくなったらプログラムが終了します

感想

データベースから検索 みたいなところは別スレッドで実行して 返り値を受け取ってどうこうするメイン部分だけをシングルスレッドでやりたいなー
system とか exec で PHP の別プロセスつくるとかありかな

そうすれば setTimeout で常にループして 指定時間まで待たなくても別スレッドで sleep して終わったらメインのキューに追加するだけで済むし