Browse Source

TaskManager#ensureWorker method guarantees worker is up and running. Helps to mitigate race condition on UI launch

Mantas 5 years ago
parent
commit
296a024c4b

+ 8 - 0
app/assets/javascripts/app/controllers/_application_controller.coffee

@@ -52,6 +52,14 @@ class App.Controller extends Spine.Controller
       @controllerId
     )
 
+  one: (event, callback) =>
+    App.Event.bind(
+      event
+      callback
+      @controllerId
+      true
+    )
+
   unbind: (event, callback) =>
     App.Event.unbind(
       event

+ 16 - 2
app/assets/javascripts/app/lib/app_post/task_manager.coffee

@@ -59,6 +59,10 @@ class App.TaskManager
     return if !_instance
     _instance.worker(key)
 
+  @ensureWorker: (key, callback) ->
+    return if !_instance
+    _instance.ensureWorker(key, callback)
+
   @nextTaskUrl: ->
     return if !_instance
     _instance.nextTaskUrl()
@@ -153,8 +157,8 @@ class _taskManagerSingleton extends App.Controller
       title:     App.i18n.translateInline('Loading...')
       head:      App.i18n.translateInline('Loading...')
     worker = App.TaskManager.worker(task.key)
-    if worker
-      data = worker.meta()
+    if worker && worker.meta
+      data = worker.meta(task)
 
       # apply meta data of controller
       if data
@@ -180,6 +184,15 @@ class _taskManagerSingleton extends App.Controller
     return @workers[ key ] if @workers[ key ]
     return
 
+  ensureWorker: (key, callback) =>
+    if worker = @worker(key)
+      callback(worker)
+      return
+
+    @one "TaskManager::#{key}::WorkerStarted", =>
+      @ensureWorker(key, callback)
+      true
+
   execute: (params) ->
     @queue.push params
     @run()
@@ -306,6 +319,7 @@ class _taskManagerSingleton extends App.Controller
     # start controller if not already started
     if !@workers[params.key]
       @workers[params.key] = new App[params.controller](params_app)
+      App.Event.trigger "TaskManager::#{params.key}::WorkerStarted"
 
     # if controller is started hidden, call hide of controller
     if !params.show