Как мне перебрать список внутри наблюдаемой? - PullRequest
0 голосов
/ 28 февраля 2019

Я все еще начинающий, когда дело доходит до Angular, и провел последние несколько дней в поисках решения.Я получаю доступ к API, который возвращает страницы результатов JSON в следующем формате: {"count": 242, "next": <link to the next page>, "results":[]}

Моя функция get выглядит следующим образом:

getJournals(searchterm, limit?: number, offset?: number): Observable<any> {
    var endpointurl = this.globalvars.apiv1Url + "search-journal?q=" + searchterm;
    if (limit != null) {
        endpointurl = endpointurl + "&limit=" + limit;
    }
    if (offset != null) {
        endpointurl = endpointurl + "&offset=" + offset;
    }
    return this.http.get(endpointurl).pipe(map((res: Response) => this.extractJournals(res)));
}

Функция извлечения обрабатывает результаты и рукиих на фабрику, поэтому я получаю объекты журнала, которые соответствуют моей модели данных.

private extractJournals(res: Response) {
    let body: any = { count: res["count"], next: res["next"], journals: [] };
    if (body["count"] > 0) {
        for (var index = 0; index < res["results"].length; ++index) {
            var journalInfo: any = res["results"][index];
            this.journalFactory.create(journalInfo, body.journals);
        }
    }

    return body || {};
}

Второй параметр функции create является необязательным и принимает список для отправки результатов обратно.Теперь о проблемной части.Страница, которая вызывает getJournals (объявление журнала помещает журналы в таблицу данных ngx):

getJournals(limit: number, offset: number) {
    this.page.limit = limit;
    this.page.offset = offset;
    this.api.getJournals("", limit, offset).subscribe((result) => {
        console.log(result);
        this.page.count = result["count"];
        if (result["count"] > 0) {
            console.log(result["journals"].length);
            result["journals"].forEach((currentjournal) => {
                console.log(currentjournal);
                var journal: any = {};

                this.rows.push(journal);
            });
            this.rows = [...this.rows];
        }
    });
}

Первый консольный журнал возвращает то, что я ожидал.Я знаю, что это наблюдаемое и возвращает не то, что было внутри него в тот момент, когда оно было зарегистрировано, но оценивается, когда я нажимаю на него в браузере.Журнал содержит все мои журналы в том виде, в котором я хочу, и все в порядке.Второй журнал возвращает «0», а третий никогда не вызывается.Из того, что я понимаю, итерация работала бы, если бы моя наблюдаемая возвратила список, но это не так, потому что я хочу перебрать список, вложенный в результат (?).Также интересно то, что result ["count"] возвращает правильный результат из API в любое время, и он заполняется функцией extractJournals.Я думаю, что это означает, что extractJournals заполнил переменную body, но не ждет цикла for, прежде чем он вернет результат?Но он обрабатывает цикл for в некоторой точке, потому что первый журнал содержит результаты цикла for.

У меня действительно нет идей.Как мне заставить работать этот последний цикл forEach, поскольку он, очевидно, не ожидает заполнения списка журналов?Я также попробовал обычный цикл for с индексом кстати.

1 Ответ

0 голосов
/ 28 февраля 2019

Воспользуйтесь преимуществом того факта, что конвейер машинописи может указать вам, где в вашем коде есть опечатка.Например:

let body: {count: number, next: string, journals: Journal[]} = {"count": res["count"], "next": res["next"], "journals": []};


this.journalFactory.create(journalInfo, body.journals);
                                             // ^^^ Please notice typo here

Почти каждая среда IDE и процесс переноса выдают ошибку, когда вы даете информацию о типе для машинописного текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...