funkcja robiąca break funkcji / bloku nadrzędnego

funkcja robiąca break funkcji / bloku nadrzędnego
Freja Draco
Freja Draco
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
0

Mam sobie np. taki kod:

Kopiuj
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ę

Kopiuj
ł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:

Kopiuj
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.


edytowany 2x, ostatnio: Freja Draco
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

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

Edit: chyba że pytasz o zwyczajne return;.


edytowany 1x, ostatnio: Patryk27
Freja Draco
Freja Draco
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
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ę.


edytowany 1x, ostatnio: Freja Draco
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

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


Freja Draco
Freja Draco
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
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.


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.