Как вернуть ответ httpclient как переменную через функцию вместо наблюдателя / обещания - PullRequest
0 голосов
/ 06 сентября 2018

Я много прочитал, и я понимаю, что мой вопрос может быть дубликатом многих других вопросов, но я не могу найти / понять ни одного из найденных ответов.

Я пытаюсьсоздайте функцию, которая будет возвращать ответ серверной части от асинхронного вызова, а не обещание или наблюдаемое.Я пробовал эти методы, но ни один из них не работает.Пожалуйста, помогите мне понять, как я могу получить ответ, который будет возвращен как переменная.

  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 голосов
/ 06 сентября 2018

что по этому поводу?

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'];
}
0 голосов
/ 06 сентября 2018

То, как я чувствую, что мой вопрос решен лучше всего:

  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 голосов
/ 06 сентября 2018

Вы должны использовать Observables, так как они более развиты, чем обещания.

Но так как вы спросили, вот stackblitz , показывающий, как создавать обещания из наблюдаемых.

Прекратите создавать обещания самостоятельно и положитесь на само наблюдаемое:

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

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

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

РЕДАКТИРОВАТЬ Новый Stabblitz с асинхронным ожиданием:

// 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();
}
...