Javascript не ждет цикла forEach

Почему browser.tabs.sendMessage(tab.id, connectionStatus); в конце приведенного ниже кода выполняется до того, как будет выполнен цикл forEach над ним?

browser.browserAction.onClicked.addListener(async tab => {

const contentScriptReady = Promise.all([
  browser.tabs.executeScript(tab.id, {file: "axios.min.js"}),
  browser.tabs.executeScript(tab.id, {file: "content.js"}),
  browser.tabs.executeScript(tab.id, { file: "sweetalert2.all.min.js" }),
  browser.tabs.insertCSS(tab.id, { file: "styles.css" })
]);

const connectionStatus = {};

var querying = browser.tabs.query({currentWindow: true, active: true});

querying.then(logTabs, onError);

function logTabs(tabs) {
  for (let tab of tabs) {
    var thisTab = tabs[0];
    var url = thisTab.url;
    var urlString = new URL(url);
    var childHSAId = urlString.searchParams.get("childhsaid");

    if (childHSAId) {
        var healthcareFacilityHSAId = urlString.searchParams.get("hsaid");
        connectionStatus.healthcareFacilityHSAId = healthcareFacilityHSAId;
        connectionStatus.childHSAId = childHSAId;

        // SE2321000057-9251 måste ändras till childHSAId
        getConnectionStatusData("SE2321000057-9251");            
    } else {

        // SE2321000057-9251 måste ändras till urlString.searchParams.get("hsaId")
        var healthcareFacilityHSAId = "SE2321000057-9251";
        connectionStatus.healthcareFacilityHSAId = healthcareFacilityHSAId;

        // SE2321000057-9251 måste ändras till healthcareFacilityHSAId
        getConnectionStatusData("SE2321000057-9251");
    }
  }
}

function onError(error) {
  console.info(`Error: ${error}`);
}

async function getConnectionStatusData(logicalAddress) {

      console.info("Det här är logicalAddress: " + logicalAddress);

  let serviceDomains = await axios.get('http://api.ntjp.se/coop/api/v1/serviceDomains.json', {
      params: {
          namespace: "crm:scheduling"
      }
  });

  serviceDomainId = serviceDomains.data[0].id;

  let connectionPoints = await axios.get('http://api.ntjp.se/coop/api/v1/connectionPoints.json', {
      params: {
          platform: "NTJP",
          environment: "PROD"
      }
  });

  connectionPointId = connectionPoints.data[0].id;

  var d = new Date(connectionPoints.data[0].snapshotTime);

  var options = { hour: '2-digit', minute:'2-digit' };

  var snapshotTime = d.toLocaleDateString('se-SE', options)

  connectionStatus.snapshotTime = snapshotTime;

  let logicalAddresss = await axios.get('http://api.ntjp.se/coop/api/v1/logicalAddresss.json', {
      params: {
          logicalAdress: logicalAddress,
          serviceConsumerHSAId: "SE2321000016-92V4",
          connectionPointId: connectionPointId
      }
  });

  if (logicalAddresss.data === undefined || logicalAddresss.data.length == 0) {

          connectionStatus.errorMessage = "HSA-id " + logicalAddress + " är inte registrerat i Ineras API för Etablerad samverkan i vården. API:t uppdaterades med data från Nationella tjänsteplattformens tjänstekatalog vid " + snapshotTime + ".";

          browser.tabs.sendMessage(tab.id, connectionStatus);

          return;

  } else {

      logicalAddressId = logicalAddresss.data[0].id;

  }

  let serviceConsumers = await axios.get('http://api.ntjp.se/coop/api/v1/serviceConsumers.json', {
      params: {
          connectionPointId: connectionPointId,
          logicalAddressId: logicalAddressId
      }
  });

  consumer = serviceConsumers.data.filter(obj => {
    return obj.hsaId === "SE2321000016-92V4";
  });

  serviceConsumerId = consumer[0].id;

  let cooperations = await axios.get('http://api.ntjp.se/coop/api/v1/cooperations.json', {
      params: {
          connectionPointId: connectionPointId,
          logicalAddressId: logicalAddressId,
          serviceDomainId: serviceDomainId,
          serviceConsumerId: serviceConsumerId,
          include: "serviceContract"
      }
  });

  cooperations.data.forEach(function(cooperation) { 
    axios.get('http://api.ntjp.se/coop/api/v1/serviceProducers.json', {
      params: {
        connectionPointId,
        logicalAddressId,
        serviceDomainId,
        serviceConsumerId,
        serviceContractId: cooperation.serviceContract.id,
      },
    }).then(response => {

        serviceContract = cooperation.serviceContract.namespace.replace('urn:riv:crm:scheduling:','').replace('Responder:1','');

        connectionStatus[serviceContract] = {
          "supported": true,
          "serviceProducerDescription": response.data[0].description,
          "serviceProducerHSAId": response.data[0].hsaId
        };
    }); 
  });

  browser.tabs.sendMessage(tab.id, connectionStatus);

} /* getConnectionStatusData */

}); /* browser.browserAction.onClicked */

Вместо этого используйте map и Promise.all

CertainPerformance 24.02.2019 09:40
Этот компилирует проблему, с которой люди обычно сталкиваются с циклами forEach.
YetAnotherBot 24.02.2019 10:51

@CertainPerformance Раньше у меня была функция карты, когда я сохранял данные ответа в виде массива. Теперь я храню данные как отдельные объекты. Могу ли я использовать карту для создания объектов? Как?

Rawland Hustle 24.02.2019 13:05

Используйте map вместо forEach, чтобы у вас был массив обещаний, которые вы можете преобразовать в одно обещание, а затем вызвать .then для этого обещания.

CertainPerformance 24.02.2019 13:06

@CertainPerformance Я пытался понять, как это сделать, но не могу заставить это работать. Я изменил forEach на map, но как преобразовать его в одно обещание?

Rawland Hustle 24.02.2019 13:37

@RawlandHustle Promise.all

Bergi 24.02.2019 14:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
26
0

Другие вопросы по теме