Javascript 如何在一个可观察对象中迭代列表?

Javascript 如何在一个可观察对象中迭代列表?,javascript,angular,Javascript,Angular,说到角度,我还是个初学者,我花了几天时间寻找解决方案。我正在访问一个API,该API以以下格式返回JSON结果页面: {“count”:242,“next”:,“results”:[]} 我的get函数如下所示: getJournals(searchterm, limit?: number, offset?: number): Observable<any> { var endpointurl = this.globalvars.apiv1Url + "search-jour

说到角度,我还是个初学者,我花了几天时间寻找解决方案。我正在访问一个API,该API以以下格式返回JSON结果页面:
{“count”:242,“next”:,“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)));
}
第一个控制台日志返回我所期望的结果。我知道它是一个可观察的对象,并不会返回它记录时的内容,而是在浏览器中单击它时得到评估。日志以我想要的形式包含了我所有的日志,一切都很好。第二个日志返回“0”,第三个日志从未被调用。 据我所知,如果我的observable本身返回了一个列表,那么迭代将起作用,但它不会,因为我想迭代嵌套在结果(?)中的列表。同样有趣的是,result[“count”]随时从API返回正确的结果,并在extractJournals函数中填充。我认为这意味着要填充body变量,但不要等到for循环返回结果?但它确实会在某个时刻处理for循环,因为第一个日志包含for循环结果


我真的没有主意了。既然最后一个forEach循环显然不需要等待日志列表被填充,我该如何让它工作呢?顺便说一句,我还尝试了一个带有索引的常规for循环。

利用typescript transpiler可以向您指出代码中存在打字错误的地方这一事实。例如:

let body:{count:number,next:string,journals:Journal[]}={“count”:res[“count”],“next”:res[“next”],“journals:[]};
this.journalFactory.create(journalInfo,body.journals);

//^^^^请注意此处的打字错误
利用typescript transpiler可以为您指出代码中存在打字错误的地方。例如:

let body:{count:number,next:string,journals:Journal[]}={“count”:res[“count”],“next”:res[“next”],“journals:[]};
this.journalFactory.create(journalInfo,body.journals);

//^^^^请注意此处的打字错误
在编辑StackOverflow代码并清除一些杂物时发生了打字错误。它不是原件。如果是,则第一个console.log将无法正确返回日志,我将编辑日志。@Sigi我强烈建议切换到
HttpClient
,如果出于某种原因必须使用Response对象,请确保您正在阅读完整的响应:在编辑StackOverflow代码和删除一些杂乱内容时发生了打字错误。它不是原件。如果是,第一个console.log将无法正确返回日志,我将编辑日志。@Sigi我强烈建议切换到
HttpClient
,如果出于某种原因必须使用Response对象,请确保您正在阅读完整的响应:您使用的是什么版本的angular?您使用的是什么http服务?如果它是
HttpClient
,它应该返回一个对象而不是响应。@shusson我使用的是
HttpClient
和Angular 7。现在,我用
数据
替换了
res:Response
,但得到了相同的结果。顺便说一句,我在任何地方都没有收到错误消息。它不会更改结果,但会帮助您导航结果。我建议您在typescript中创建一个接口来描述您的数据,这将有助于您正确解析数据。您使用的是angular的哪个版本以及您使用的http服务?如果它是
HttpClient
,它应该返回一个对象而不是响应。@shusson我使用的是
HttpClient
和Angular 7。现在,我用
数据
替换了
res:Response
,但得到了相同的结果。顺便说一句,我在任何地方都没有收到错误消息。它不会更改结果,但会帮助您导航结果。我建议您在typescript中创建一个接口来描述您的数据,这将帮助您正确解析数据。
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 || {};
}
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];
        }
    });
}