我正在编写一个处理动态生成表单的节点/角度Web应用程序,表单数据通过套接字传递。我遇到了一个问题,如果我切换控制器,有时会在新控制器准备好处理它之前发出套接字事件(包含要问的问题)。我以为我已经通过顶级'SocketController'解决了这个问题,它处理所有套接字通信并通过发出事件将其传递给子控制器,但事实证明我只是降低了出现此问题的频率。
在向下传递问题之前,我可以等待控制器/视图内容准备就绪,但由于这两个事件没有按特定顺序发生,并且其中一个包含数据,因此很多代码看起来很乱。
我情不自禁地觉得我忽视了一个更简单的解决方案 是否有任何常见的模式/技术来处理这类事情?
答案 0 :(得分:0)
这是承诺组合非常方便的地方。
你正在等待的事情可能已经有了你可以使用的承诺(如果没有,你可以保证 - 如果他们)。所以从每个人那里得到一个承诺(比如p1
和p2
),然后当两个承诺都已解决时,使用$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;
});