等待没有特定顺序的两个事件

时间:2016-03-14 14:24:11

标签: javascript angularjs node.js sockets

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

在向下传递问题之前,我可以等待控制器/视图内容准备就绪,但由于这两个事件没有按特定顺序发生,并且其中一个包含数据,因此很多代码看起来很乱。

我情不自禁地觉得我忽视了一个更简单的解决方案 是否有任何常见的模式/技术来处理这类事情?

3 个答案:

答案 0 :(得分:0)

这是承诺组合非常方便的地方。

你正在等待的事情可能已经有了你可以使用的承诺(如果没有,你可以保证 - 如果他们)。所以从每个人那里得到一个承诺(比如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
    });

答案 1 :(得分:0)

我建议在下面的链接中使用$ 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()
}
});

答案 2 :(得分:0)

我最终实施了一个简单的工厂服务来处理问题 .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); });

每当状态发生变化时,问题都会被设置为空 $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams, options){ QuestionService.questions = null; });