• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Promise.all zawierająca fukcję async oraz await jQuery.get wywala 503

Aruba Cloud - Virtual Private Server VPS
0 głosów
138 wizyt
pytanie zadane 24 grudnia 2022 w JavaScript przez rafaeru Początkujący (330 p.)

Witam, poprawiam kod bota gry przeglądarkowej i mam pewien problem. JS jest dla mnie mega dziwny dlatego potrzebuje o jakieś nakierunkowanie jak mogę poprawić mój problem albo pod jakimi frazami mogę tego szukać.

Problem jest następujący:

Bot ma sprzedawać przedmioty do NPC które ma w paczkach. Po dłuższym czasie bocenia liczba paczek może być bardzo duża i wtedy pojawia się problem, ponieważ algorytm sprawdza najpierw ile ma stron takich paczek lecz wysyłając taką wiadomość przy użyciu:

await jQuery.get

Gdy liczba paczek jest większa mniej więcej niż 15 serwer sypie 503.

Zastanawiałem się nad dodaniem może jakiegoś delay pomiędzy każdym wywołaniem funkcji?

Finalnie problem rozwiązałem dodając limit do sprawdzania max. 10 stron paczek (wtedy, żeby sprzedać np. 100 stron musze użyć funkcjonalności 10 razy) lecz takie rozwiązanie mnie nie satysfakcjonuje i chciałbym zrozumieć jak to działa i zrobić to solidnie.

Poniżej zamieszczam fragment kodu:

  async onFindEmptySpotSuccess(t, e) {
    if (packages.stop) {
      tools.reload();
      return;
    }

    packages.bagSpot = Object.assign(t, {
      b: e
    });
    document.querySelectorAll('#inventory_nav a')[e - 512].click();
    packages.inv = document.getElementById('inv');
    const body = await jQuery.get(tools.link.full({
      mod: 'packages',
      f: '0',
      fq: storage.packages.quality[0],
      qry: '',
      page: 0,
      sh: tools.url.query('sh')
    }));
    const page = (await jQuery(body).find('.paging_right_full')[0]) ? jQuery(body).find('.paging_right_full')[0].href.match(/\d+$/)[0] : 1;
	let new_page = Math.min(page, 10);
    packages.packageList = [];
    packages.packageHolder = [];
    Promise.all([...Array(parseInt(page)).keys()].map(page => packages.getPackages(page + 1))).then(() => {
	  console.log('WSKAKUJE TUTAJ!');
      packages.packageList = packages.packageList.sort((a, b) => b.s - a.s);

      if (packages.packageList.length > 0) {
        packages.sellItems();
      } else window.location.reload();
    });
  },

  async getPackages(_p) {
	console.log('getPackages: ', _p);
    if (packages.stop) {
      tools.reload();
      return;
    }
    await jQuery.get(tools.link.full({
      mod: 'packages',
      f: '0',
      fq: storage.packages.quality[0],
      qry: '',
      page: _p,
      sh: tools.url.query('sh')
    }), t => {
      tools.statusText(tools.translate('workflow-packagesScan') + ' ' + _p);
      var e = jQuery(t).find('.packageItem');
      if (e.length > 0) {
        for (let j = 0; j < e.length; j++) {
          let p = e[j],
              id = p.querySelector('input').value,
              i = p.querySelector('.ui-draggable'),
              b = parseInt(tools.item.getItemBasis(i).split('-')[0]),
              g = b == 14 ? true : false,
              s = tools.item.getItemSize(i),
              q = tools.item.getItemAmount(i),
              f = !g && storage.packages.useSmeltFilter ? !smelt.isSmeltItem(i) : true;

          if (storage.packages.type.indexOf(b) > -1 && storage.packages.quality.indexOf(parseInt(tools.item.getItemQuality(i))) > -1 && !g && f) {
			console.log('item: ', i);
            packages.packageList.push({
              p,
              i,
              s,
              id,
              q
            });
          }
        }
      }
      return;
    });
    return;
  },

Za wszystkie porady z góry dziękuje.

Wesołych Świąt!

1 odpowiedź

0 głosów
odpowiedź 5 stycznia 2023 przez spamator12 Nałogowiec (28,230 p.)
To, ze dostajesz wynik z promise.all czy tam promise.race nie oznacza, ze pozostale promisy sie "koncza". Server nadal zuzywa zasoby na bezuzyteczne obliczenia. Zerknij na AbortController i AbortSignal aby poprawnie zamykac promisy.
1
komentarz 5 stycznia 2023 przez Wiciorny Ekspert (280,470 p.)
Jeśli dostaje wynik z promise.all znaczy, że wszystkie obietnice są spełnione.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
Oczywiście mowa o obietnicach które są argumentami promise.all, a nie wszystkimi w aplikacji.

Podobne pytania

0 głosów
4 odpowiedzi 950 wizyt
pytanie zadane 5 marca 2019 w JavaScript przez PROFF Obywatel (1,180 p.)
0 głosów
2 odpowiedzi 1,589 wizyt
pytanie zadane 5 lutego 2020 w C# przez kubekszklany Gaduła (3,250 p.)
0 głosów
1 odpowiedź 206 wizyt
pytanie zadane 18 listopada 2019 w JavaScript przez Krzysztofson Użytkownik (620 p.)

93,337 zapytań

142,332 odpowiedzi

322,423 komentarzy

62,676 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...