Функция вызова после завершения услуги вызова - PullRequest
0 голосов
/ 10 июля 2019

У меня есть функция для вызова службы

private callService() {
   this.functionOne();
   this.functionTwo();
   this.functionThree();
}

private getOtherInfo() {
   // pure sync here
   this.getId(this.user['data']);
   this.getType(this.name['data']);
}

Я хочу, чтобы сначала выполнялся порядок выполнения callService, а затем getOtherInfo.Однако я обнаружил, что код не может достичь второй функции.

Функции внутри callService как-то похожи на

private functionOne() {
    this.user['loading'] = true;
    this.service['user'].get().subscribe(data => {
    this.user['data'] = data;
   }
}

private functionTwo() {
    this.name['loading'] = true;
    this.service['name'].get().subscribe(data => {
    this.name['data'] = data;
   }
}
.....

Так что я изменил функцию как

private callService(): Promise<any> {
     return Promise.resolve() => {
      this.functionOne();
      this.functionTwo();
      this.functionThree();
     });
} 

В ngOnInit() Я звоню

this.callService().then(()=> this.getOtherInfo());

Однако вторая функция все еще не достигнута.

Ответы [ 2 ]

1 голос
/ 10 июля 2019

все это можно решить с помощью наблюдаемых без необходимости обещаний ...

вы захотите изменить свои три функции так:

private functionOne() {
    this.user['loading'] = true;
    return this.service['user'].get();
}

private functionTwo() {
    this.name['loading'] = true;
    return this.service['name'].get();
}

и тогда ваш callService будет выглядеть так:

private callService(): Promise<any> {
     forkJoin(
      this.functionOne(),
      this.functionTwo(),
      this.functionThree()
     ).subscribe(([user, name, fnThreeData]) => {
       this.user['data'] = user;
       this.name['data'] = name;
       //whatever with fnThreeData
       this.getOtherInfo();
     });
} 

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

1 голос
/ 10 июля 2019

Код не выглядит правильно.functionOne, functionTwo и т. Д. ... фактически не возвращают обещание.Они вообще ничего не возвращают.У вас есть .subscribe, но вы никогда ничего с этим не делаете.Если вы оберните свои функции в обещание и разрешите их правильно, вы сможете ожидать их всех без каких-либо проблем:

Пример:

private functionOne() {
    return new Promise( (resolve, reject) => {
        this.user['loading'] = true;
        this.service['user'].get().subscribe(data => {
        this.user['data'] = data;
           resolve();
        });
    });
}

private functionTwo() {
    return new Promise( (resolve, reject) => {
        this.name['loading'] = true;
        this.service['name'].get().subscribe(data => {
            this.name['data'] = data;
            resolve();
        });
    });
}

private callService(): Promise<any> {
     return new Promise( async (resolve, reject) => {
      await this.functionOne();
      await this.functionTwo();
      await this.functionThree();
     });
});

Вот пример того, как структурироватьэто (этот вопрос не является конкретным угловым)

function functionOne() {
	return new Promise( (resolve, reject) => {
  	setTimeout( () => resolve('return from function 1'), 1000);
  })
}
function functionTwo() {
	return new Promise( (resolve, reject) => {
  	setTimeout( () => resolve('return from function 2'), 1000);
  })
}

async function callAllFunctions() {
	const result1 = await functionOne();
  console.log(result1);
  const result2 = await functionTwo();
  console.log(result2);
}

callAllFunctions().then( () => console.log('finished'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...