funkcja robiąca break funkcji / bloku nadrzędnego

0

Mam sobie np. taki kod:

list: {
 console.log(1);
 console.log(2);

 break list;

 console.log(3);
 console.log(4);
}

Polecenia w bloku wykonają się tylko do punktu przełamania.

I teraz chcę zrobić funkcję

łam_go() {
  tu jakieś polecenia...

  break list;
}

Żeby za jednym zamachem wywołać określony zbiór podprocedur i zaniechać wykonywania dalszego ciągu oryginalnego bloku. Da się?

edit: Udało mi się znaleźć coś takiego:

throw new Error("Kill 'em all!");

Które działa podobnie do PHP-owego halt i w kontekście potrzebnego mi akurat zastosowania sprawdzi się znakomicie, ale w sumie to jestem ciekawa, czy da się to jednak zrobić, bez zabijania całego JS na stronie.

0

Brzmi na solidne X/Y - jak wygląda Twój oryginalny problem?

Edit: chyba że pytasz o zwyczajne return;.

0

Mój oryginalny problem wygląda tak:

  • Skrypt rozszerzenia przeglądarki otwiera nowe okno i wysyła do niego za pomocą chrome.runtime.sendMessage komunikaty z poleceniami JS.
  • Inny skrypt tego samego rozszerzenia odbiera je i stara się wykonać za pomocą try / eval w kontekście otwartej strony.
  • Jeśli wszystko jest ok, przesyła komunikat zwrotny do pierwotnego skryptu i system jedzie dalej (np. wysyła kolejną paczkę poleceń do wykonania).

Potrzebuję móc wstawić w przesyłanym bloku poleceń warunkową dyrektywę, która:

  • wyśle komunikat zwrotny,
  • poniecha wykonywania reszty kody z bloku try / eval.

Mogę to zrobić dwiema linikjami:

  • funkcja_wysyłająca_komunikat_zwrotny();
  • break list;
    Jeśli blok do do wykonania zapakuję wcześniej w "list: {}"

Ale to trochę kulawe, bo powinna być jedna, prosta funkcja.
throw new Error("Kill 'em all!");
Plus trochę kombinowania, żeby otwarta strona nie raportowała tego "błędu" jako błędu wykonania załatwia sprawę.

0

Hmm, czyli zwyczajne return; odpada?
Nie jesteś w stanie evalować tego swojego kodu wewnątrz funkcji?

0

Mogę evalować i wewnątrz funkcji albo bloku z lable, ale żadne z powyższych nie pozwoli zrobić globalnego break/return z poziomu podprocedury uruchomionej przez wywołanie podfunkcji wewnątrz takiego bloku. Guglanie przyniosło ogólnie odpowiedź: tak się nie da.
Tak sobie jeszcze myślę, że można zrobić str.replace stringa z kodem przed evalowaniem łam_go(); -> łam_go(); break; ale to takie jakieś.

Można jeszcze zawsze napisać w ramach przesyłanego bloku porządny kod:

if (cośtam) {
raportuj_że_koniec();
} else {
wykonaj jakieś inne polecenia...
}

Ale t porządność czasami jest upierdliwa.

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