break labelName; wewnątrz funkcji

0

Cześć,

Nie znalazłem takiej informacji w internetach więc będę pytać tutaj. Wiem, że break; w javascript umożliwia opuszczenie nazwanego bloku, co byłoby dla mnie zbawieniem gdyż tworzę skrypt pod GreaseMonkeya (Jquery), który przy otrzymaniu określonej odpowiedzi od serwera powinien zakończyć działanie. Niestety nie działa wywołanie wyjątku (throw new Error()), więc pomyślałem o tym. Niestety wpisanie break labelName; powoduje, że skrypt w ogóle nie działa (błąd składniowy). Coś w tym stylu (w dużym uproszczeniu):

function funkcja1(i, z) {
  labelName: {
    var l = location.protocol + '//' + location.host + ((location.port)?':'+location.port:'') + '/script1.php?id=' + i;
    $.post(l, 'arguments_here').done(function(r){
      // parsowanie odpowiedzi i jakieś warunki ble ble
      (...)
      else {
        // gdy otrzymamy spodziewaną odpowiedź
        $.post(l, 'new_arguments_here').done(function(r){
          // parsowanie odpowiedzi i jakies warunki
          else if (something) {
            //całkowite zakończenie funkcji
            break labelName;
          }
        };
      }
      // coś tutaj
      setTimeout(function(){funkcja1(++i, z)},500);
    });
  }
}

I tu pytanie: Powyższe nie działa bo nie można opuścić w ten sposób funkcji, czy po prostu coś źle robię.
Zamiast $.post oczywiście używam GM_xmlhttpRequest, ale nie z uwagi na cross domain, lecz na własciwość finalUrl. Nie mam pomysłu jak to obejść.

0

Nie można opuścić funkcji w ten sposób.

0
dzek69 napisał(a):

Nie można opuścić funkcji w ten sposób.

Jest jakis sposób na obejście tego? Zależy mi, aby w określonej sytuacji nie wykonywała się linia wykonująca funkcję iteracyjnie.
Próbowałem używać throw new Error("Limit reached");, gdyż według informacji na internecie powinno to zakonczyć wykonanie skryptu, ale w rzeczywistości nic się nie dzieje.

0

możesz po prostu zakończyć funkcję poprzez return, a chwilę wcześniej w zmienną wpisać jakiś bieżący stan, wg którego wykonasz dalszą część kodu.

0

musisz zrozumieć jak działają wywołania asynchroniczne - nie możesz powrócić do etykiety labelName bo nie jesteś w tym momencie wewnątrz

załóżmy że pierwsze $.post zawsze zwróci odpowiedź po 1ms, a drugie po 10 sekundach
wówczas poleci pierwszy post (1ms), na jego obsłudze (po 1ms) dajesz prośbę o drugi post (który trwa 10 sekund) i zlecasz powtórzenie operacji po 0,5s
po 10 sekundach już zdążysz wysłać 20 kolejnych requestów a dopiero przyjdzie odpowiedź na pierwszy wewnętrzny - nie możesz wtedy anulować zdarzeń które się już zdarzyły

to co chcesz zrobić to prawdopodobnie wrzucenie setTimeout z mniejszym timeoutem w miejsce // parsowanie odpowiedzi i jakies warunki i ignorowanie w miejscu break

1 użytkowników online, w tym zalogowanych: 0, gości: 1