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

时间:2018-09-06 10:02:34

标签: angular http asynchronous promise async-await

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

我正在尝试创建一个函数,该函数将从异步调用返回后端的响应,而不是promise或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的键,用于保存我的回复。但是我不知道如何访问它(例如,上面的第二个功能无法按预期运行)。

3 个答案:

答案 0 :(得分:0)

您应该使用Observables,因为它们比Promise更加发达。

但是,自您提出要求以来,这里的stackblitz向您展示了如何根据可观察对象创建承诺。

停止自行创建承诺,并依靠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 :(得分:0)

我觉得自己的问题得到了最好的解决:

var totalSelectedElements = 0

func select(at: Int) {
    ayes[at].selectionCount += 1
    totalSelectedElements += 1
}

func deselect(at: Int) {
    ayes[at].selectionCount -= 1
    totalSelectedElements -= 1
}

答案 2 :(得分:-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'];
}