не ожидает получения данных с сервера по http - PullRequest
0 голосов
/ 17 мая 2019

привет, у меня есть локальный сервер на порту A и одно веб-приложение на порту 4200 на сервере есть данные, которые я запрашиваю через http

data.service.ts:

    export class DataService {
      constructor(private httpClient: HttpClient) {}

      async get_p() {
        return await this.httpClient.get<object[]>('/some api').toPromise();
      }

      async get_s() {
        return await this.httpClient.get<object[]>('/some api').toPromise();
      }
    }

в другом файле TS:

          init() {
            let p1 =this.dataService.get_s().then((result) => {this.s = 
             result; } ) ;
            let p2 = this.dataService.get_p().then((result) => {this.p = 
             result; } );

            Promise.all([p1, p2]).then(values => {
              console.log(values); ///undefined
            });

            console.log("not waiting for data");

также есть сообщения об ошибках, но они ссылаются на тот факт, что p и s не инициализированы.

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

спасибо

1 Ответ

0 голосов
/ 17 мая 2019

Ваши обещания p1 и p2 не имеют никакого разрешенного значения, потому что обработчики .then() присваивают result this.s и this.p, но они ничего не возвращают, поэтому разрешенные значения для p1 и p2 являются undefined. Помните, что возвращаемое значение из обработчика .then() становится разрешенным значением обещания.

Таким образом, когда вы делаете это:

Promise.all([p1, p2]).then(values => {
    console.log(values); ///undefined
});

Все values будет массивом undefined. Если вместо этого вы делаете это:

Promise.all([p1, p2]).then(values => {
    console.log(this.p, this.s);
});

вы должны увидеть ваши ценности. Или же вы можете вернуть эти значения из обработчиков .then(), и тогда каждое обещание будет иметь разрешенное значение.

      init() {
        let p1 =this.dataService.get_s().then((result) => {
            this.s = result; 
            return result;  // set resolved value of promise
        });
        let p2 = this.dataService.get_p().then((result) => {
             this.p = result; 
             return result;  // set resolved value of promise
        });

        Promise.all([p1, p2]).then(values => {
          console.log(values); // will show the resolved values now
        });
...