Mam funkcję, która pobiera listę pojazdów z DB. Należy to odwzorować, wysyłając kolejne żądanie dla każdego z tych pojazdów. Wyniki są następnie przekazywane do tablicy.

Mój problem polega na tym, że muszę móc poczekać, aż wszystkie pojazdy zostaną zapętlone i dopóki bucketStopVehcilesPosition zbierze wszystkie dane. Następnie kontynuuj z innym kodem.

Nie udaje mi się to, ponieważ funkcja mapy kończy się szybciej i nie przejmuje się drugim żądaniem do bazy danych. W końcu je odzyskuję, ale kod jest już ukończony. Zatem console.log tworzy pustą tablicę.

To nie pierwszy raz, kiedy napotykam ten problem. Czy ktoś ma jakieś wzorcowe rozwiązanie tego rodzaju problemu?

Dziękuję bardzo za twoją radę.

AdminTable.getStopVehiclesPosition()
    .then((result) => {
      return Promise.all(result.map((item) => {
        AdminTable.getLatestPosition({vehicleId: item.vehicleId})
        .then((data) => {
          bucketStopVehiclesPosition.push({ 
            vehicleId: item.vehicleId,
            plateNumber: item.plateNumber,
            lat: data.position.coords.lat,
            lon: data.position.coords.long,
            heading: data.position.coords.heading,
            speed: data.position.coords.speed
          }) 
        })
      }))
      .then(() => {
        console.log(bucketStopVehiclesPosition)
      })
    })
0
xyz83242 20 listopad 2019, 14:49
7
return AdminTable... lub usuń {} wokół korpusu strzałki.
 – 
Yury Tarabanko
20 listopad 2019, 14:52
Musisz zwrócić coś na mapie return AdminTable.getLatestPosition
 – 
Bravo
20 listopad 2019, 14:52
Zamieścić to jako odpowiedź? :)
 – 
Grabofus
20 listopad 2019, 15:17

1 odpowiedź

Musisz użyć reduce, jeśli chcesz kolejno realizować swoje obietnice. map jest synchroniczny.

    AdminTable.getStopVehiclesPosition()
      .then((result) =>
        result.reduce( async (previousPromise, item) => {
          await previousPromise;
          return AdminTable.getLatestPosition({vehicleId: item.vehicleId})
                  .then((data) => {
                    bucketStopVehiclesPosition.push({ 
                      vehicleId: item.vehicleId,
                      plateNumber: item.plateNumber,
                      lat: data.position.coords.lat,
                      lon: data.position.coords.long,
                      heading: data.position.coords.heading,
                      speed: data.position.coords.speed
                    }) 
                  });
        }, Promise.resolve())  
      );
-1
Rem 20 listopad 2019, 15:08
Nie odpowiada na pytanie. OP nie prosił o sekwencyjne rozwiązywanie.
 – 
Grabofus
20 listopad 2019, 15:15
Ale nie da się od razu rozwiązać tych obietnic. Musisz go sekwencyjnie rozwiązać, aby można było wypchnąć dane wyjściowe. Dlatego umieścił to na swoim pytaniu: „Nie udaje mi się w tym, ponieważ funkcja map kończy się szybciej i nie dba o drugie żądanie do bazy danych. W końcu je pobieram, ale kod jest już ukończony. Więc console.log tworzy pusty szyk"
 – 
Rem
20 listopad 2019, 15:17
Możesz je zmapować do tablicy obietnic i rozwiązać je za pomocą Promise.all, jak wspomniał Yury w komentarzu. Problem polega na tym, że kod jest obecnie mapowany na undefined, ponieważ obietnica zwrócona przez AdminTable.getLatestPosition() nie jest zwracana w funkcji map.
 – 
Grabofus
20 listopad 2019, 15:20
Ahh rozumiem twój punkt widzenia. Tak, pierwszy komentarz jest poprawny. Nie zwrócił czwartej linii. Dziękuję
 – 
Rem
20 listopad 2019, 15:27
Odpowiedź jest nadal poprawna, po prostu nie odpowiadając na pytanie :)
 – 
Grabofus
20 listopad 2019, 15:30