代码之家  ›  专栏  ›  技术社区  ›  Dave

servicenow:与recordwatch和$rootscope计时问题

  •  0
  • Dave  · 技术社区  · 6 年前

    我们的团队正在开发ServiceNow中的应用程序。我们在一个动态更新的小部件上有一个recordwatch,但是我们也希望使用rootscope将数据广播到另一个小部件上,并进行其他更新。我们遇到的问题是$rootscope的延迟,我们不确定如何缓解它。

    我们的服务器脚本如下:

    data.tasksCompleted = false;
    
        if (input && input.action === 'getTasks')
            getTasks(data.user_id);
    
        function getTasks(userId) {
            data.tasks = new sn_hr_core.hr_Task().getMyTasks(data.user_id);
            for (var i = data.tasks.length-1; i >= 0; i--) {
                var task = new sn_hr_sp.hr_TaskTicket().getTasks(data.tasks[i].sys_id, 'sn_hr_core_task');
                data.tasks[i].taskInfo = task;
                if(data.tasks[i].state == '3'){
                    data.tasksCompleted=true;
                }
            }
        }
    

    我们的带有记录表的客户机脚本如下:

    spUtil.recordWatch($scope, 'sn_hr_core_task', '',function(event,data){
            spUtil.update($scope);
            setTimeout(function(){ 
                $rootScope.$broadcast('onboardingCompletedTasks', $scope.data.tasksCompleted);  
            }, 5000);   
        });
    

    为了让另一个小部件接收任务完成标志并进行相应的更新,我们必须使用延迟5秒的设置超时。如果没有5秒的延迟,记录表工作得太快,而另一个小部件则根本不更新。有没有办法使这些事情更顺利?我们目前的方法是可行的……但是用户体验很糟糕。

    欢迎提出任何建议。谢谢!

    1 回复  |  直到 6 年前
        1
  •  0
  •   Gordon Mohrin    6 年前

    这里的根本问题是 spUtil.update($scope); 是异步的,并且$broadcast将在服务器加载所有任务之前发生。

    您需要做的是在服务器逻辑完成后发送$broadcast。

    我建议您观看客户端上完成的data.tasks并将广播放在回调中:

     $scope.$watch(data.tasksCompleted, , function(value) {
        if (value)
        $rootScope.$broadcast('onboardingCompletedTasks', $scope.data.tasksCompleted);
      }); 
    

    这样,当data.taskscompleted从服务器更新为true时,广播将被发送。