質問編集履歴

1

ソース2の追加

2016/07/06 11:23

投稿

rokugasenpai
rokugasenpai

スコア8

test CHANGED
File without changes
test CHANGED
@@ -14,13 +14,21 @@
14
14
 
15
15
  の順番に記述して実行すると、run()の次へ処理が進まず、addTimer()が完了するまで待ってしまう。
16
16
 
17
- 下記のソースのvar_dumpを基準に言うと、現状ではA→B→C→F→Gとなり、
17
+ 下記のソース1のvar_dumpを基準に言うと、現状ではA→B→C→F→Gとなり、
18
18
 
19
19
  目的の処理であるD・Eを通らない。
20
20
 
21
+ 問題解決のためaddPeriodicTimer()を使ったソース2を用意した。
22
+
23
+ 非同期ならAAAA...BBBB...と出力されるはずだが、実際に実行すると、
24
+
25
+ A(1秒後)BA(1秒後)B...と非同期とは考えられない出力になった。
26
+
27
+ 何か勘違いしてるはずなんだけど...
21
28
 
22
29
 
30
+
23
- ###該当のソースコード
31
+ ###ソース1
24
32
 
25
33
  ```PHP
26
34
 
@@ -122,6 +130,52 @@
122
130
 
123
131
 
124
132
 
133
+ ###ソース2
134
+
135
+ ```PHP
136
+
137
+ $deferred = new Promise\Deferred();
138
+
139
+ $loop = EventLoop\Factory::create();
140
+
141
+ $timeout_sec = 0.1;
142
+
143
+ $tick = 0.01;
144
+
145
+ $elapsed = 0.0;
146
+
147
+ $loop->addPeriodicTimer($tick,
148
+
149
+ function (EventLoop\Timer\Timer $timer) use ($loop, &$elapsed, $tick, $timeout_sec) {
150
+
151
+ $elapsed += $tick;
152
+
153
+ var_dump('A:' . microtime(TRUE) . ':' . $elapsed);
154
+
155
+ // 非同期ならAAAA...BBBB...と出力されるはず。
156
+
157
+ sleep(1);
158
+
159
+ var_dump('B:' . microtime(TRUE) . ':' . $elapsed);
160
+
161
+ if ($elapsed >= $timeout_sec)
162
+
163
+ {
164
+
165
+ $loop->cancelTimer($timer);
166
+
167
+ var_dump('C:' . microtime(TRUE));
168
+
169
+ }
170
+
171
+ });
172
+
173
+ $loop->run();
174
+
175
+ ```
176
+
177
+
178
+
125
179
  ###お願い…
126
180
 
127
181
  ReactPHPで使われる非同期処理については、