Можно ли как-то дождаться результатов нескольких обещаний в разрешении angular-ui-router?

0

В настоящее время мой код выглядит так:

 resolve: {
            adminTestLevel: ['testService', (tes: ITestService) => {
                return tes.getAdminTestLevel();
            }],
            adminTestStatus: ['testService', (tes: ITestService) => {
                return tes.getAdminTestStatus();
            }],
            adminTestType: ['testService', (tes: ITestService) => {
                return tes.getAdminTestType();
            }],
            adminTestGradeType: ['testService', (tes: ITestService) => {
                return tes.getAdminTestGradeType()
            }],
            exams: ['testService', (tes: ITestService) => {
                return tes.getExams();
            }],
            examTypes: ['testService', (tes: ITestService) => {
                return tes.getExamTypes();
            }],
            testOrderBy: ['testService', (tes: ITestService) => {
                return tes.getTestOrderBy();
            }],
            topics: ['testService', (tes: ITestService) => {
                return tes.getTestsTopics();
            }],
        },

Есть ли способ, которым я мог бы упростить это, чтобы у меня не было так много инъекций ITestService? Также мне не нужно иметь все разные разрешения, и, если возможно, я хотел бы объединить их в один.

Теги:
angular-ui-router
angular-promise

2 ответа

1
Лучший ответ

вы можете попытаться использовать $q.all(promises)

из документации для ($ q):

$q.all(promises);
Объединяет несколько обещаний в единое обещание, которое разрешается, когда все вступительные обещания разрешаются.

поэтому вы можете комбинировать несколько обещаний в массиве обещаний и ждать решения. вы можете выглядеть так:

resolve: {
    required_data: function($q, testService) {
        return $q.all([
            testService.getAdminTestLevel(),
            testService.getAdminTestStatus(),
            testService.getAdminTestType()

            // and so on for all other promises
        ])
    }
}

затем в вашем контроллере, также из той же документации

$q.all(promises)
Возвращает одно обещание, которое будет разрешено с помощью массива/хэша значений, каждое значение, соответствующее обещанию с тем же индексом/ключом в массиве обещаний/хеш

вы можете получить доступ к результату из required_data введенных в ваш контроллер.
например, adminTestLevel будет доступен по required_data[0]... и т.д., в том же порядке вы создали свой массив обещаний в маршрутизаторе.

1

Вы можете использовать $ q.all

resolve: {
    myDate: function($q, tes) {     
        return $q.all([tes.getAdminTestLevel(), ... , tes.getTestsTopics()]);
    }
}

myData будет разрешаться только после того, как все обещания в массиве будут разрешены

$q.all даст вам массив результатов, которые вы можете использовать в своем контроллере, вы можете получить к ним доступ по индексу, чтобы он был менее удобным, чем простая инъекция.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню