• 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

VPS Starter Arubacloud
0 głosów
84 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 (269,120 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 608 wizyt
pytanie zadane 5 marca 2019 w JavaScript przez PROFF Obywatel (1,180 p.)
0 głosów
2 odpowiedzi 1,062 wizyt
pytanie zadane 5 lutego 2020 w C# przez kubekszklany Gaduła (3,170 p.)
0 głosów
1 odpowiedź 158 wizyt
pytanie zadane 18 listopada 2019 w JavaScript przez Krzysztofson Użytkownik (620 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...