ServiceNow: проблема с синхронизацией recordWatch и $ rootcope - PullRequest
0 голосов
/ 12 января 2019

Наша команда разрабатывает приложение в ServiceNow. У нас есть запись записи на виджете, которая обновляется динамически, но мы также хотим использовать rootcope для трансляции данных на другой виджет, а также для обновления чего-то еще. Проблема, с которой мы сталкиваемся, - это задержка в $ rootcope, и мы не уверены, как ее уменьшить.

Наш серверный скрипт выглядит так:

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;
            }
        }
    }

А наш клиентский скрипт с recordWatch выглядит так:

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

Нам пришлось использовать setTimeout с 5-секундной задержкой, чтобы другой виджет получил флаг tasksCompleted и соответственно обновился. Без 5-секундной задержки recordWatch работает слишком быстро, а другой виджет вообще не обновляется. Есть ли способ сделать эти вещи более гладкими? Наш текущий способ работает ... но пользовательский опыт ужасен.

Любые предложения приветствуются. Спасибо!

1 Ответ

0 голосов
/ 14 января 2019

Основная проблема здесь в том, что spUtil.update($scope); является асинхронным, и трансляция $ произойдет до того, как сервер загрузит все задачи.

Что вам нужно сделать, это отправить $ широковещательную рассылку после завершения логики вашего сервера.

Я бы посоветовал вам посмотреть data.tasksCompleted на клиенте и поставить трансляцию в обратный вызов:

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

Таким образом, когда data.tasksCompleted обновлений с сервера для истинного широковещания будет отправлено.

...