@@ -16,19 +16,6 @@ module JS
1616 Undefined = JS . eval ( "return undefined" )
1717 Null = JS . eval ( "return null" )
1818
19- def self . promise_scheduler
20- @promise_scheduler
21- end
22-
23- def self . eval_async ( code , future )
24- @promise_scheduler ||= PromiseScheduler . new Fiber . current
25- Fiber . new do
26- future . resolve JS ::Object . wrap ( Kernel . eval ( code . to_s , nil , "eval_async" ) )
27- rescue => e
28- future . reject JS ::Object . wrap ( e )
29- end . transfer
30- end
31-
3219 class PromiseScheduler
3320 Task = Struct . new ( :fiber , :status , :value )
3421
@@ -66,6 +53,21 @@ def enqueue(task)
6653 end
6754 end
6855 end
56+
57+ @promise_scheduler = PromiseScheduler . new Fiber . current
58+
59+ def self . promise_scheduler
60+ @promise_scheduler
61+ end
62+
63+ private
64+ def self . __eval_async_rb ( rb_code , future )
65+ Fiber . new do
66+ future . resolve JS ::Object . wrap ( Kernel . eval ( rb_code . to_s , nil , "eval_async" ) )
67+ rescue => e
68+ future . reject JS ::Object . wrap ( e )
69+ end . transfer
70+ end
6971end
7072
7173class JS ::Object
@@ -83,13 +85,9 @@ def respond_to_missing?(sym, include_private)
8385 end
8486
8587 def await
86- sched = JS . promise_scheduler
87- unless sched
88- raise "JS::Object#await can be used only in RubyVM.evalAsync"
89- end
9088 # Promise.resolve wrap a value or flattens promise-like object and its thenable chain
9189 promise = JS . global [ :Promise ] . resolve ( self )
92- sched . await ( promise )
90+ JS . promise_scheduler . await ( promise )
9391 end
9492end
9593
0 commit comments