質問するログイン新規登録

質問編集履歴

1

ソース2の追加

2016/07/06 11:23

投稿

rokugasenpai
rokugasenpai

スコア8

title CHANGED
File without changes
body CHANGED
@@ -6,10 +6,14 @@
6
6
  $timeout_loop->addTimer(...);
7
7
  $timeout_loop->run();
8
8
  の順番に記述して実行すると、run()の次へ処理が進まず、addTimer()が完了するまで待ってしまう。
9
- 下記のソースのvar_dumpを基準に言うと、現状ではA→B→C→F→Gとなり、
9
+ 下記のソース1のvar_dumpを基準に言うと、現状ではA→B→C→F→Gとなり、
10
10
  目的の処理であるD・Eを通らない。
11
+ 問題解決のためaddPeriodicTimer()を使ったソース2を用意した。
12
+ 非同期ならAAAA...BBBB...と出力されるはずだが、実際に実行すると、
13
+ A(1秒後)BA(1秒後)B...と非同期とは考えられない出力になった。
14
+ 何か勘違いしてるはずなんだけど...
11
15
 
12
- ###該当のソースコード
16
+ ###ソース1
13
17
  ```PHP
14
18
  <?php
15
19
  namespace Hoge;
@@ -60,6 +64,29 @@
60
64
  }
61
65
  ```
62
66
 
67
+ ###ソース2
68
+ ```PHP
69
+ $deferred = new Promise\Deferred();
70
+ $loop = EventLoop\Factory::create();
71
+ $timeout_sec = 0.1;
72
+ $tick = 0.01;
73
+ $elapsed = 0.0;
74
+ $loop->addPeriodicTimer($tick,
75
+ function (EventLoop\Timer\Timer $timer) use ($loop, &$elapsed, $tick, $timeout_sec) {
76
+ $elapsed += $tick;
77
+ var_dump('A:' . microtime(TRUE) . ':' . $elapsed);
78
+ // 非同期ならAAAA...BBBB...と出力されるはず。
79
+ sleep(1);
80
+ var_dump('B:' . microtime(TRUE) . ':' . $elapsed);
81
+ if ($elapsed >= $timeout_sec)
82
+ {
83
+ $loop->cancelTimer($timer);
84
+ var_dump('C:' . microtime(TRUE));
85
+ }
86
+ });
87
+ $loop->run();
88
+ ```
89
+
63
90
  ###お願い…
64
91
  ReactPHPで使われる非同期処理については、
65
92
  node.jsやCommonJSを扱ったことがないので基本的な理解が不足しているかもしれません。