Как заставить одну из нескольких асинхронных c функций ждать какой-то конкретный c один или запускать синхронно для некоторых c случаев? - PullRequest
0 голосов
/ 07 августа 2020

В приложении Angular у меня есть компонент и услуга, указанные ниже. У меня есть три флажка в связанных div, и обычно флажок по умолчанию установлен для данных, полученных из вызова asyn c api в ngOnInit.

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

Мой метод проверки функции - это метод async, поэтому я вызвал это похоже на (async () => { ... })(), как показано ниже.

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

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

Мои вопросы:

  1. Как я могу вызвать async getFeatures() {} синхронно в этом случае?
  2. Как я могу настроить, как getFeatures будет запускаться последним или после getPreset?
@Component({
/...
})
export class AComponent implements OnInit {
   ngOnInit() {

     //do some things 

     this.getPreset(); //async calls 
     
     // my new async function call
     (async () => {
      let utpFeature = await this.featureService.getFeatures("runPlans");
      this.utpFeatureStatus = utpFeature ? utpFeature.Status : true;

      //enabling next one which is "FillInYourself" checkbox if it does not have a feature
      this.MyForm.controls["FillInYourself"].setValue(!this.utpFeatureStatus);
       
    })();
   }

   getPreset() {
      //get a lot of data async from multiple services 

      //set one of three checkboxes as marked as default.
      forkJoin([getFoo, getBar, getBaz]).subscribe((results: any) => {
         //transform result and process data
         checkedUseFirstPlan(data); //normally default checkbox
      }
   }

   checkedUseFirstPlan(data: boolean) {
    if (!data) {
      this.MyForm.controls["UseFirstPlan"].setValue(true);
      return;
    }
    this.MyForm.controls["UseFirstPlan"].setValue(data);
    this.MyForm.controls["FillInYourself"].setValue(!data);
    this.MyForm.controls["OtherPlan"].setValue(!data);
  }
}



//service
async getFeatures(keyname: string) {
   //...
   await this.apiService.getFeatures().toPromise().then((result: any) => {
      //process result and obtain feature related to this keyname
   }
   return feature;
}


1 Ответ

1 голос
/ 07 августа 2020

Это просто пример выполнения асинхронных c функций с помощью await. Все 3 функции в примере будут запускаться одна за другой в строгом порядке

// Use async
(async () => {
  // Function 1
  const fn1 = (val) => {
    return new Promise((resolve, reject) => {
      // Do some stuff here
      val = val + 1;
      // Resolve result.
      // Can be resolved from any level
      // of nested function!
      function nested1() {
        function nested2() {
          resolve(val);
        }
        nested2();
      }
      nested1();
    });
  };
  
  // Function 2
  const fn2 = (val) => {
    return new Promise((resolve, reject) => {
      // Do some stuff here
      val = val * 2;
      // Resolve result
      resolve(val);
    });
  };
  
  // Function 3
  const fn3 = (val) => {
    return new Promise((resolve, reject) => {
      // Do some stuff here
      val = val + 1000;
      // Resolve result
      resolve(val);
    });
  };
  
  // Sync code
  let val = 5;
  
  val = await fn1(val); // Wait until fn1 resolves
  val = await fn2(val); // Wait until fn2 resolves
  val = await fn3(val); // Wait until fn3 resolves
  
  console.log(val);
})();
...