【问题标题】:Waiting for two events in no specific order无特定顺序等待两个事件
【发布时间】:2016-03-14 14:24:11
【问题描述】:

我正在编写一个处理动态生成的表单的节点/角度网络应用程序,表单数据通过套接字进行通信。我遇到了一个问题,如果我切换控制器,有时会在新控制器准备好处理它之前发出套接字事件(包含要问的问题)。我以为我已经通过拥有一个顶级“SocketController”解决了这个问题,它处理所有套接字通信并通过发出事件将其传递给子控制器,但事实证明我只是降低了这个问题出现的频率。

在传递问题之前,我可以等待控制器/视图内容准备好,但是由于这两个事件没有特定的顺序发生,并且其中一个包含数据,所以它会变成很多看起来很乱的代码。

我不禁觉得我忽略了一个更简单的解决方案。
处理这类事情有什么共同的模式/技术吗?

【问题讨论】:

    标签: javascript angularjs node.js sockets


    【解决方案1】:

    这就是 Promise 组合非常方便的地方。

    你正在等待的东西可能已经有了你可以使用的承诺(如果没有,你可以承诺化它们)。所以从他们每个人那里得到一个承诺(比如,p1p2),然后在两个承诺都得到解决后使用$q.all 来获得回调:

    $q.all([p1, p2])
        .then(function(results) {
           // Use results[0] (the result of p1) and results[1] (the result of p2)
        }).catch(function() {
           // Handle error
        });
    

    【讨论】:

      【解决方案2】:

      我建议在下面的链接中使用 $q.allSettled 设计来链接承诺,直到它们完成。

      $q.allSettled([promise0, promise1])
           .then(function (data) {
             // handle sockets here
            });
      

      更多细节和设计注意事项是here

      要做出承诺,请执行以下操作:

          new Promise(function (resolve, reject) {
        socket.on("", function(service){
            // success
           resolve(); or service.success()
            // error
           reject(); or service.error()
      }
      });
      

      【讨论】:

      • 我对此的唯一问题是一个事件可能会在另一个事件之前重复多次(即一个状态/视图中的多组问题)。这会导致我的套接字处理程序等待每个问题的“就绪”事件吗?
      【解决方案3】:

      我最终实现了一个简单的工厂服务来处理这些问题。
      .factory('QuestionService', function(){ return {questions: null} })
      套接字控制器在收到问题时将问题存储在此服务中。 socket.on(eventName, function(questions){ QuestionService.questions = questions; }) 每个状态的控制器都会监视此值,更新表单加载(如果存在问题)以及收到新的问题集。
      $scope.$watch(function(){ return QuestionService.questions }, function(questions){ if(questions) $scope.$broadcast('form:question', questions); });

      只要状态发生变化,问题就会被设置回 null。
      $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams, options){ QuestionService.questions = null; });

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-29
        • 1970-01-01
        相关资源
        最近更新 更多