Подтвердить что ты не робот

Angular UI-маршрутизатор не обрабатывает функцию разрешения, когда я использую функцию async/await?

Я пытаюсь отобразить определенный шаблон, связанный с состоянием и компонентом, в соответствии с этой статьей

В моем проекте, запущенном под dev-сервером, все работает отлично, и когда я выполняю $state.go("home"), шаблон компонента загружается, как я ожидаю, но когда я это делаю в тестовой среде, это не работает.

Прежде чем при тестировании, когда я использую "старый способ", используя "шаблон" вместо "компонента" с ui-router, выполнить $rootScope.$digest() было достаточно, чтобы добавить шаблон внутри <div ui-view></div>, но используя этот новый способ больше не работает.

Что я делаю неправильно?

Изменить. Я пытался понять суть проблемы, и я вижу, что проблема связана с запросом HTTP, который был выполнен. Возможно, это связано с тем, как мое обещание решает проблему обратного вызова с помощью async/await. Проверьте Сервис:

Сервис

export class TodoService {
    constructor($http, BASE_URL) {
        this.http = $http;
        this.url = `${BASE_URL}/todos`
    }
    async getTodos() {
        const apiResponse = await this.http.get(this.url)
        return apiResponse.data.todos
    }
}
4b9b3361

Ответ 1

Проблема заключается в том, что angular ожидает angular Promise, поэтому ваша работа будет работать, но ваш ожидание не будет, вы можете решить эту проблему, используя библиотеку, например: https://www.npmjs.com/package/angular-async-await или создайте конструкцию, как показано здесь https://medium.com/@alSkachkov/using-async-await-function-in-angular-1-5-babel-6-387f7c43948c

Удачи вам в вашей проблеме!

Ответ 2

Это всего лишь образованное предположение, основанное на моем понимании того, как работают resolve -ers и что делает ngMock. В первом примере ваш resolve для getTodos не возвращается до тех пор, пока обещание $http не будет разрешено, после чего вы отбросите значение от ответа и вернете его. Тем не менее, resolve -ers ожидают значение $q.Promise в качестве сторожевого устройства, чтобы удерживать рендеринг маршрутизатора до его разрешения. В вашем коде, в зависимости от того, как он переполняется, скорее всего, вызов await и return не дает правильного значения дозорного значения, поэтому он обрабатывается как синхронный ответ.

Один из способов тестирования - запросить resolve -er в контроллере для вашего компонента todolist и проверить значение. Я буду держать пари, что это НЕ $q.Promise, хотя это может быть родной Promise.

При использовании resolve, однако, просто соедините Promise, добавив then и верните его. Маршрутизатор будет обрабатывать остальные.

Или лучше, переключитесь на Observables! (/me уток входящих помидоров)