Witam!
Mam program, ktory poprzez formularz tworzy liste zakupow. Obecnie pisze wersje z wykorzystaniem asynchronicznych zadan HTTP. Problem wystepuje przy dodawaniu nowych elementow(jesli dodawanie elementu o numer wiekszego niz ostatni na liscie to dziala), a dokladniej przy dodawaniu elementu o id, ktory juz istnieje. Rozwiazuje to tak, ze dodaje nowy element do listy, tuz za koncem i przypisuje wartosc zakupu poprzedniego kolejnemu, w kolejnosci od ostatniego az do elementu o zadanym id. Nastepnie dla zadanego id wpisuje nowa wartosc.
Np. gdy:
- Jablko.
- Gruszka.
- Chleb.
i dodaje 1. Bulka to robie tak:
4. cos.
nastepnie 4. cos zamieniam na -> 4.Chleb.,3.Chleb -> 3.Gruszka, 2. Gruszka -> 2. Jablko i 1. Jablko -> 1. Bulka.
W kodzie rozwiazuje to tak, ze najpierw tworze wymagana ilosc obietnic w tablicy obietnic, a nastepnie przy uzyciu tych obietnic wykonuje jedna po drugiej i na koncu przypisuje nowa wartosc.
Spodziewalem sie, ze program wykona sie w serii jedna po drugiej tworzenie obietnic, nastepnie w serii jedna po drugiej wywolanie obietnic i na koncu po nich ustawienie dodawanej wartosci zakupu. Czesto tak jest, ze dziala dobrze, ale czasem kolejnosc jest zaburzona i wartosci przy id nie sa w kolejnosci w jakiej powinny byc(i pomagajac sobie wypisywaniem wartosci widze czasem, ze np. przypisanie wartosci o id 2 do id 3 nastapilo przed przypisaniem wartosci o id 3 do wartosci o id 4). Czy przy podanym kodzie jest to mozliwe? A jesli tak, to ktory fragment dziala zle?
Zamieszczam pogladowy kod:
wywolanie:
this.iterateAndCreatePromises(promises, to, k, i, id,tresc); //wywolanie, promises tutaj jeszcze puste,to przechowuje oryginalne this, k poczatkowe to ostatni numer zakupu
//id to numer zakupu do dodania, a tresc to tresc zakupu do dodania
pierwsza funkcja:
iterateAndCreatePromises(promises: any,to: any,k: number,i: number,id:number,tresc: string) {
promises.push(new Promise((resolve) => { //utworzenie w tablicy obietnic kolejnych obietnic, jesli dobrze rozumiem przy tworzeniu tych obietnic nic sie nie wywoluje wewnatrz,
//dopiero w drugiej funkcji
to.model.ustawZakup(k, to.model.zwrocZakup(i).nazwa, k, to); //przesuwanie zakupow kolejno o jeden numer identyfikatora nizej
console.log("Sprawdz! i k: " + k);
console.log("Numer k przy iterowaniu obietnic: " + k);
k--;
resolve();
}));
if (k >= id) {
this.iterateAndCreatePromises(promises, to, k, i, id,tresc);
}
else this.iterateAndDoPromises(promises, 0, to, id, tresc);
}
druga funkcja:
iterateAndDoPromises(promises: any,p: number,to: any,id: number,tresc: string,) {
promises[p].then(() => { // when done
console.log("Obietnica o numerze: " + p);
if (promises[++p]) this.iterateAndDoPromises(promises, p,to,id,tresc); //wywolaj kolejna obietnice
else to.model.ustawZakup(id, tresc, to);
});
}
Bardzo prosze o pomoc w naprawieniu programu, aby dzialal poprawnie, o wskazanie bledow, bo sam juz nie wiem czemu dziala tak jak opisalem.