Angular - дождаться вызова функции до конца sh, чтобы продолжить с кодом - PullRequest
4 голосов
/ 20 января 2020

Я пишу фрагмент кода, который проверяет, не вызовут ли 2 лекарства неблагоприятную реакцию на лекарства.

Моя функция checkForCla sh () вызывает функцию getCollisionsList (), которая должна заполнить переменная insteractionsLists.

Часть кода выглядит следующим образом (игнорируйте бит usingSynonym)

 if(usingSynonum){

       interactionsLists = await this.getCollisionsList(i, idOfSyn);


       }else {

       interactionsLists = await this.getCollisionsList(i, listOfAllMeds2[j].id);

       }

       console.log("WHAT IS BEING EXAMINED " + interactionsLists[i].length);

Проблема здесь заключается в том, «ЧТО ИМЕЕТСЯ ИЗУЧЕНО», т.е. потому что вызов getCollisionsList, который заполнил взаимодействия, еще не завершен.

Вот функция getCollisionsLists:

   getCollisionsList(i, id): DrugInteraction[][] {
        let interactions: Array<DrugInteraction> = new Array<DrugInteraction>();
         let dataa = {};
        this.httpClient.getInteractionById(id).subscribe(data => {

            dataa=data;

            const JSONdata: any = data;
            console.log("DATA " + data.length);



            for (let i = 0; i < JSONdata.length; i++) {
                const int: DrugInteraction = new DrugInteraction(JSONdata[i].drug_id, JSONdata[i].name, JSONdata[i].description);
                interactions.push(int);
            }



        });

        interactionsLists.push(interactions);
        return interactionsLists;

    }

Как вы можете видеть по выводу консоли, функция выполняет выборку «ДАННЫЕ», но функция checkForCla sh (main) продолжает работу с кодом, не дожидаясь, пока эти данные будут заполнены в списках взаимодействия. Вот вывод консоли:

[Log] WHAT IS BEING EXAMINED 0 
[Log] DATA 645 
[Log] DATA 1706

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

Извините за беспорядок в коде, я очень плохо знаком с Angular, и я попробовал все, чтобы попытаться сделать это.

1 Ответ

3 голосов
/ 20 января 2020

Просто преобразуйте Observable в Promise с toPromise() и await их внутри async функции (использовал IIFE, как это кажется логичным в вашем контексте):

(async function() {
  if (usingSynonum) {
    await this.getCollisionsList(i, idOfSyn);
  } else {
    await this.getCollisionsList(i, listOfAllMeds2[j].id);
  }
  console.log(...)
})();

...

getCollisionsList(i, id) {
  let interactions: Array<DrugInteraction> = new Array<DrugInteraction>();
  let dataa = {};
  return this.httpClient.getInteractionById(id).toPromise().then(
    data => {
      ... work with your response

И не подписывайтесь, если вы вернете toPromise().

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

...