【问题标题】:Angular could not push http response in array propertyAngular 无法在数组属性中推送 http 响应
【发布时间】:2018-12-31 20:38:47
【问题描述】:

我使用 httpclient 从 API 获取一个 json 值,该值包含 angular 6 中的 ID,我将该 ID 传递到另一个 url 以获取每个 ID 的结果,该 ID 将执行 id.length 次。我已经声明了一个数组属性并尝试将第二个 http 结果推送到数组中。当我注销结果时,我可以看到结果没有被插入到方形信封中; json 值远离方括号。请在下面的图片中找到结果。谁能给我解决方案如何在数组属性中正确推送值。

角度服务:

    import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { Stories } from '../stories';
import { error } from 'util';
import { tap, map, catchError } from 'rxjs/operators';




@Injectable({
  providedIn: 'root'
})
export class HackerStoriesService {

  Story: Array<any> = [];
  ChildStory: Array<object> = []; 

  constructor(private http: HttpClient) { 

  }

  getStories(){
    this.http.get<Stories[]>('URL')
    .subscribe((response) => {
      this.Story = response;

      for(let i=0;i<=this.Story.length;i++){
           this.http.get('URL'+this.Story[i]+'.json')
           .subscribe((response)=> {
             this.ChildStory.push(response)
           })  

      }
      console.log(this.ChildStory)

     return this.ChildStory; 
    },
   (error) => {console.log("Error occurred" + error)},
 ()=> {console.log("The subscription is completed")});



 }


}

结果:

当我记录结果 console.log(this.ChildStory) 时,我得到以下结果。) https://i.stack.imgur.com/1korE.jpg[1]

【问题讨论】:

  • 您在 URL 调用完成之前记录了 ChildStory。请记住回调函数是如何工作的。如果你想同步做事情,你可以尝试使用Promise.all()或尝试rxjs提供的各种方法
  • 但我可以在浏览器控制台中看到响应。 (i.stack.imgur.com/1korE.jpg)。如果 URL 调用未完成,则我看不到正确的结果。只有当我在属性中给出数组位置时,它才会给出未定义。
  • 控制台的输出首先出现,URL 稍后完成。如果在push到ChildStpry之后放一个console.log,可以看到结果实际上是push到了数组中。
  • 我正在尝试在 for 循环执行后记录结果。你能告诉我在上面的代码中我可以在哪里放置console.log。那会很有帮助。
  • 放在this.ChildStory.push(response)之后

标签: arrays angular push


【解决方案1】:

在您调用 console.log 的那一刻,该变量为空,但是当您稍后在控制台中查看它时,该变量已填充,这就是您可以在那里看到值的原因。 (如here所述)

你可以在你的 getStory() 函数中做的是返回一个 Observable。它可能看起来有点像:

getStories() {
    return new Observable<Stories[]> ( (observer) => {
        this.http.get<Stories[]>('URL').subscribe((response) => {

            this.Story = response;
            let storiesCalls = [];
            for (let i = 0; i < this.Story.length; i++) {
                storiesCalls.push(this.http.get('URL' + this.Story[i]+'.json'));
            }

            forkJoin(storiesCalls).subscribe((childStories) => {
                observer.next(childStories);
                observer.complete();
            });

        }, (error) => {
            console.log("Error occurred" + error)
            observer.error(error);
            observer.complete();
        });
    });
}

然后你可以在任何你想使用检索值的地方订阅返回的 Observable:

hackerStoriesServiceInstance.getStories().subscribe((childStories) => {
    //do stuff with childStories object
}

我没有时间运行代码,所以可能存在一些“错误”,如果您发现任何问题,请告诉我并更新答案。

【讨论】:

  • 感谢您前来帮助我。我在上面的代码中遇到错误:预期的 0-1 参数,但得到了 2。你能帮我解决它吗?
  • 我编辑了我的代码。有一些括号丢失/太多。请重试并告诉我。另外请发布错误的确切堆栈跟踪,否则将很难猜测问题。我使用我的一个 API 尝试了上面的示例,并将其调整为您的代码。它现在应该可以工作了。或者至少它不应该需要太多的适应。另请注意,变量应以驼峰命名。另请注意,您的 for 语句中有错误。它应该从 i=0 到 i
猜你喜欢
  • 2015-04-06
  • 2021-01-19
  • 2020-10-10
  • 2020-12-18
  • 2021-10-13
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 2020-05-23
相关资源
最近更新 更多