• 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

Object Storage Arubacloud
0 głosów
87 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,710 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 653 wizyt
pytanie zadane 5 marca 2019 w JavaScript przez PROFF Obywatel (1,180 p.)
0 głosów
2 odpowiedzi 1,107 wizyt
pytanie zadane 5 lutego 2020 w C# przez kubekszklany Gaduła (3,190 p.)
0 głosów
1 odpowiedź 159 wizyt
pytanie zadane 18 listopada 2019 w JavaScript przez Krzysztofson Użytkownik (620 p.)

92,552 zapytań

141,399 odpowiedzi

319,534 komentarzy

61,938 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...