当前位置: 首页 > 知识库问答 >
问题:

如何在angular中从可观察的/http/async调用返回响应?

武功
2023-03-14

我有一个服务,返回一个可观察到的,做一个超文本传输协议请求到我的服务器,并获得数据。我想使用这些数据,但我总是最终得到未定义的。有什么问题?

服务:

@Injectable()
export class EventService {

  constructor(private http: Http) { }

  getEventList(): Observable<any>{
    let headers = new Headers({ 'Content-Type': 'application/json' });
    let options = new RequestOptions({ headers: headers });

    return this.http.get("http://localhost:9999/events/get", options)
                .map((res)=> res.json())
                .catch((err)=> err)
  }
}

组成部分:

@Component({...})
export class EventComponent {

  myEvents: any;

  constructor( private es: EventService ) { }

  ngOnInit(){
    this.es.getEventList()
        .subscribe((response)=>{
            this.myEvents = response;
        });

    console.log(this.myEvents); //This prints undefined!
  }
}

我检查了如何从异步调用返回响应?发布,但找不到解决方案

共有3个答案

郁光熙
2023-03-14

如果仅在模板中使用myEvents,则可以使用asyncPipe。

下面是asyncPipe和Angular4 HttpClient示例

锺离逸春
2023-03-14

在angular/javascript中进行http调用是一种异步操作。所以,当您进行http调用时,它将分配新线程来完成此调用,并在下一行使用另一个线程开始执行。这就是为什么会得到未定义的值。因此,请进行以下更改以解决此问题

this.es.getEventList()  
      .subscribe((response)=>{  
       this.myEvents = response;  
        console.log(this.myEvents); //<-this become synchronous now  
    });
子车煌
2023-03-14

原因:

它未定义的原因是您正在进行异步操作。这意味着完成getEventList方法需要一些时间(主要取决于您的网络速度)。

让我们看看http调用。

this.es.getEventList()

使用subscribe实际发出(“激发”)http请求后,您将等待响应。在等待时,javascript将执行此代码下面的行,如果遇到同步分配/操作,它将立即执行这些行。

因此,在订阅getEventList()并等待响应之后,

console.log(this.myEvents)

该行将立即执行。在响应从服务器(或您首先初始化它的对象)到达之前,它的值是未定义的

这类似于:

ngOnInit(){
    setTimeout(()=>{
        this.myEvents = response;
    }, 5000);

    console.log(this.myEvents); //This prints undefined!
}

那么我们如何克服这个问题呢?我们将使用回调函数,它是订阅方法。因为当数据从服务器到达时,它将在响应的订阅中。

因此,将代码更改为:

this.es.getEventList()
    .subscribe((response)=>{
        this.myEvents = response;
        console.log(this.myEvents); //<-- not undefined anymore
    });

将打印响应。。过了一段时间。

除了记录响应之外,您的响应可能还有很多事情要做;当数据到达时,您应该在回调内(在subscribe函数内)执行所有这些操作。

另一件需要提及的事情是,如果您来自Promise背景,那么回调对应于subscribe,具有可观察性。

您不应该尝试将异步操作更改为同步操作(您不能)。我们使用异步操作的原因之一是不要让用户等待操作完成,而他们可以在这段时间内做其他事情。假设您的一个异步操作需要3分钟才能完成,如果我们没有异步操作,接口将冻结3分钟。

建议如下:

这个答案的最初功劳是:如何从异步调用返回响应?

但是在angular2版本中,我们被引入了打字稿和可观察性,所以这个答案有望涵盖处理可观察性异步请求的基础知识。

 类似资料:
  • 问题内容: 我有返回一个observable的服务,该服务向我的服务器发出一个http请求并获取数据。我想使用这些数据,但是我总是最终得到。有什么问题? 服务内容 : 零件: 问题答案: 原因: 这是因为您正在执行异步操作。意味着完成该方法将需要一些时间(主要取决于您的网络速度)。 因此,让我们看一下http调用。 实际发出(“触发”)请求后,与您的http请求将 等待 响应。等待期间,javas

  • 在一个服务中,我有两个API调用,每个调用都返回一个可观察的,在我的组件中,我有一些条件,如果为true,我必须调用这两个函数,但我需要等待get()调用,这样我就可以使用get调用返回的参数执行post函数。如果为false,我只想用已经定义的参数调用post函数。 服务: 组成部分: 我不想重复帖子调用的代码,或者如果不可能的话,只是不要在另一个订阅()中使用订阅()。我怎么能这么做?没有异步

  • 我对Observables和RxJs是新手,我想对回报进行调整。如果第一个选择器返回某个值,我希望第二个选择器可以观察到。但是如果第一个选择器没有返回那个特定的值,我想返回false,而不是(false)。我已经走了这么远,但这返回了一个可观察的结果

  • 我有一个组件订阅服务中的一个可观察对象。该方法反过来订阅另一个服务中的可观察对象。我想将一个数组从最后一个服务传递回第一个服务,然后第一个服务将该数组传递回组件。更具体地说,该组件调用其本地服务,然后调用一个数据服务,该数据服务通过http客户端访问我的数据库。http客户端正在工作,数据服务将数组返回给本地服务。本地服务接收数组,但我不知道如何将该数组作为可观察对象传递回组件。以下是简短的代码块

  • 我来自同步编程背景,我很难理解可观察性。 这是我的服务/提供商的摘录(离子2项目) 我将从订阅它。关于这一点,我有几个问题。 > 即使我没有声明,上面的代码是否返回一个可观察/观察者? 响应是JSON。如何检查/处理JSON并执行一些操作,如 那就做吧 我认为应该在提供者类中完成。只是一个典型的提示/例子将是真棒。 当请求到达subscribe方法时,它是否真的发生了? 创建和返回Angular

  • 函数应该从get请求返回一个 在这种情况下,我只能在为真时执行请求,否则我在函数