Przede wszystkim przepraszam, jeśli jest to podstawowe pytanie, ale nie jestem w stanie tego zrobić. Mam obietnicę, że wstawia dane do tabeli (sqlite) i mam do iteracji po tablicy. Chcę umieścić wszystkie te dane w tabeli, ale chcę wiedzieć, kiedy się skończy, aby na końcu wyświetlić komunikat. Sprawdzałem ( i == array.length -1 ) wyświetlał komunikat, ale to nie wydaje się poprawne. Jeśli nie zrobię tego w ten sposób, komunikat zostanie wyświetlony przed zakończeniem. Mam dwie inne obietnice, które powinny przebiegać wzdłuż tej jednej i powyższe rozwiązanie (wydaje się być złym rozwiązaniem) nie zadziałałoby w tym przypadku, ponieważ można zakończyć po iteracji lub przed nią. Skąd mam wiedzieć, kiedy wszystkie też są gotowe? Proszę, mógłbyś mi pomóc?

Oto mój kod:


 for (let i = 0; i < this.data_array.length; i++) {
    this.database.insertService(this.data_array[i]).then(async () => {
         console.log('Inserting object number ' + this.data_array[i].id);
           if( i == this.data_array.length - 1) {
              console.log('done!');
           }
     }).catch(err => console.log('error inserting object into the table'));
 }                  

Dziękuję Ci.

2
memyselfandi 3 kwiecień 2020, 23:57

4 odpowiedzi

Najlepsza odpowiedź

Możesz rozwiązać ten problem za pomocą Promise.all

Oto przykład, a tutaj przydatna dokumentacja

Przykład używa zamiast tego mapy pętli for do iteracji po tablicy.

Nie testowałem tego, ale to powinno działać

    Promise.all(
      this.data_array.map((data) => {
        console.log('Inserting object number ' + data.id);
        return this.database.insertService(data);
      })
    )
      .then((result) => console.log('done', result))
      .catch((error) => console.log(error));
1
Kevin Amiranoff 3 kwiecień 2020, 21:50

Lepiej jest użyć {{X0 }} podczas zajmowania się takimi przypadkami. Prosty przykład byłby następujący:

let i;
let promises = [];
for (i = 0; i < 5; ++i)
     promises.push(someAsyncFunc(i));

Promise.all(promises)
     .then((results) => {
          console.log("All done", results);
     })
    .catch((e) => {
         console.log(e)
    });
2
Majed Badawi 3 kwiecień 2020, 21:09

Możesz użyć Promise.all([]), gdzie .all() wziąć tablicę.

Promise.all(
  // Map the items in data_array to the async insertService function
  this.data_array.map(dataEntry => this.database.insertService(dataEntry))
).then((resultArray) => {
  console.log(resultArray.length);
  console.log('done!');
}).catch((e) => {
     console.log(e)
});
1
Andrew Nolan 3 kwiecień 2020, 21:15

Myślę, że Promise.all jest tutaj najlepszym rozwiązaniem

async method() {
  const promises = this.data_array.map(item => 
  this.database.insertService(item));
  try  {
    const result = await Promise.all(promises);
    console.log({ result });
  } catch (error) {
      console.log({ error });
  }
}
1
Max Starling 3 kwiecień 2020, 21:19