11package japgolly .scalajs .react
22
3- import japgolly .scalajs .react .internal .{catchAll , identityFn }
3+ import japgolly .scalajs .react .internal .{catchAll , identityFn , newJsPromise }
44import scala .collection .generic .CanBuildFrom
55import scala .concurrent .duration .FiniteDuration
66import scala .concurrent .{ExecutionContext , Future }
@@ -16,6 +16,21 @@ object AsyncCallback {
1616 def apply [A ](f : (Try [A ] => Callback ) => Callback ): AsyncCallback [A ] =
1717 new AsyncCallback (f)
1818
19+ def init [A , B ](f : (Try [B ] => Callback ) => CallbackTo [A ]): CallbackTo [(A , AsyncCallback [B ])] =
20+ for {
21+ (ac, c) <- promise[B ]
22+ a <- f(c)
23+ } yield (a, ac)
24+
25+ /** Create an AsyncCallback and separately provide the completion function.
26+ *
27+ * This is like Scala's promise, not the JS promise which is more like Scala's Future.
28+ */
29+ def promise [A ]: CallbackTo [(AsyncCallback [A ], Try [A ] => Callback )] =
30+ for {
31+ (p, pc) <- newJsPromise[A ]
32+ } yield (fromJsPromise(p), pc)
33+
1934 def first [A ](f : (Try [A ] => Callback ) => Callback ): AsyncCallback [A ] =
2035 new AsyncCallback (g => {
2136 var first = true
@@ -398,19 +413,10 @@ final class AsyncCallback[A] private[AsyncCallback] (val completeWith: (Try[A] =
398413 }
399414
400415 def asCallbackToJsPromise : CallbackTo [js.Promise [A ]] =
401- CallbackTo {
402- new js.Promise [A ]((respond : js.Function1 [A | Thenable [A ], _], reject : js.Function1 [Any , _]) => {
403- def fail (t : Throwable ) =
404- reject(t match {
405- case js.JavaScriptException (e) => e
406- case e => e
407- })
408- completeWith(t => Callback (t match {
409- case Success (a) => respond(a)
410- case Failure (e) => fail(e)
411- })).runNow()
412- })
413- }
416+ for {
417+ (p, pc) <- newJsPromise[A ]
418+ _ <- completeWith(pc)
419+ } yield p
414420
415421 def unsafeToFuture (): Future [A ] =
416422 asCallbackToFuture.runNow()
0 commit comments