• 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 PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
52 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 przez spamator12 Nałogowiec (27,810 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 przez Wiciorny Ekspert (251,410 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 276 wizyt
pytanie zadane 5 marca 2019 w JavaScript przez PROFF Obywatel (1,180 p.)
0 głosów
2 odpowiedzi 614 wizyt
pytanie zadane 5 lutego 2020 w C# przez kubekszklany Gaduła (3,100 p.)
0 głosów
1 odpowiedź 125 wizyt
pytanie zadane 18 listopada 2019 w JavaScript przez Krzysztofson Użytkownik (620 p.)

90,816 zapytań

139,494 odpowiedzi

313,557 komentarzy

60,313 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...