如何通过函数而不是观察者/承诺将httpclient响应作为变量返回

问题描述 投票:0回答:3

我已经阅读了很多内容,并且我理解我的问题可能与许多其他问题重复,但我似乎无法找到/理解我找到的任何答案。

我试图创建一个函数,它将从异步调用返回后端的响应,而不是prommise或observable。我尝试过这些方法,但它们都没有用。请帮助我理解如何将响应作为变量返回。

  callQuery() {
    return new Promise(resolve => {
      this.httpclient.get(MyUrl).subscribe((response) => {
        resolve(response);
      });
    });
  }

  callQuery() {
    return new Promise((resolve, reject) => {
      this.httpclient.get(MyUrl).subscribe((response) => {
        resolve(response);
      });
    })['__zone_symbol__value'];
  }

  async callQuery() {
    return await new Promise((resolve, reject) => {
      this.httpclient.get(MyUrl).subscribe((response) => {
        resolve(response);
      });
    });
  }

因此,console.log(callQuery())不断返回一个名为ZoneAwarePromise的物体。在这个对象里面实际上有一个名为__zone_symbol__value的键可以保存我的响应。但我不知道如何访问它(例如上面的第二个函数不能按预期工作)。

angular http asynchronous promise async-await
3个回答
0
投票

我觉得我的问题解决方法最好:

  async callQuery() {
    return await new Promise((resolve, reject) => {
      this.httpclient.get(MyUrl).subscribe((response) => {
        resolve(response);
      });
    });
  }

  async WhateverFunction() {
    ...
    const MyVar = await this.callQuery());
    console.log(MyVar);
    ...
  }

0
投票

您应该使用Observables,因为它们比承诺更容易开发。

但是,既然你问过,这里有一个stackblitz向你展示如何从可观察者创造承诺。

停止自己创建promises,并依赖Observable本身:

ngOnInit() {
  this.createPromiseFromObservable(this.createDelayedObservable()).then(() => {
    console.log('Promise fullfilled');
  });
}

createDelayedObservable() {
  return of(true)
    .pipe(delay(500));
}

createPromiseFromObservable(obs: Observable<any>) {
  return obs.toPromise();
}

用异步编辑新的stackblitz并等待:

// Declare the function as async to use await
async ngOnInit() {
  // awaits for the result, then prints it in console.
  // Remove this.createDelayedObservable() and use this.http.get(...) for real HTTP calls
  const res = await this.createPromiseFromObservable(this.createDelayedObservable());
  console.log(res);
}

// simulate an HTTP call taking 500ms to complete. Can be deleted.
createDelayedObservable(): Observable<any> {
  return of(true)
    .pipe(delay(500));
}

// Transforms an observable into a promise to be used with await
createPromiseFromObservable(obs: Observable<any>): Promise<any> {
  return obs.toPromise();
}

-1
投票

那这个呢 ?

const callQuery = function() {
    return new Promise((resolve, reject) => {
      this.httpclient.get(MyUrl).subscribe((response) => {
        resolve(response);
      });
    });
  }

const getResult = async function() {
    const response = await callQuery();
    return response['__zone_symbol__value'];
}
© www.soinside.com 2019 - 2024. All rights reserved.