• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

wykrycie przebiegu pętli

VPS Starter Arubacloud
0 głosów
472 wizyt
pytanie zadane 9 października 2019 w JavaScript przez Pytajnikowiec Początkujący (290 p.)

Siemacie,
Mam coś takiego na przykład:

const users = [
    {id: "4h23iu", name: "Foo"},
    {id: "j423io", name: "Bar"}
]

function writeUser(user) {
    return user;
}

users.forEach(user => writeUser(user))

I teraz chciałbym zrobić w funkcji writeUser warunek:

const users = [
    {id: "4h23iu", name: "Foo"},
    {id: "j423io", name: "Bar"}
]

function writeUser(user) {
    /**
     * jeśli wywołanie zostało w pętli
     *      console.log('jesteś w pętli')
     * jeśli poza pętlą
     *      console.log('nie jesteś w pętli)
     */
    return user;
}

users.forEach(user => writeUser(user))

Jak mogę to sprawdzić lub rozpoznać?

4 odpowiedzi

+1 głos
odpowiedź 9 października 2019 przez Comandeer Guru (604,780 p.)

Nie da się tego zrobić w żaden sensowny sposób. W przypadku zwykłej pętli to już w ogóle się nie da. Ale jest pewien trick, żeby to zrobić, przy pomocy niestandardowego Error.prototype.stack, by wykryć, że jest to odpalane wewnątrz Array.forEach (dzięki temu, że to funkcja):

let i = 0;

[ 1, 2, 3 ].forEach( value => fn( value ) );

fn();

function fn() {
	try {
		throw new Error();
	} catch ( e ) {
		var pattern = /(Array\.)?forEach/;

		console.log( pattern.test( e.stack ) ? 'W pętli' : 'Nie w pętli' );
	}
}

Od razu uprzedzam, że działa na Chrome i Safari, ale już nie w Firefoksie, który ma dość bezużyteczny stack dla błędów.

komentarz 9 października 2019 przez ScriptyChris Mędrzec (190,190 p.)

Można by jeszcze próbować coś rzeźbić z function.caller.

0 głosów
odpowiedź 9 października 2019 przez Michałełe Nałogowiec (25,600 p.)
const users = [
    {id: "4h23iu", name: "Foo"},
    {id: "j423io", name: "Bar"}
]
 
function writeUser(user, state){
	if( state){
		console.log( "jestes w petli")
	} 
	else{
		console.log( "nie jestes w petli")
	}

	return users;
}
 
users.forEach(user => writeUser(user, true))

Do funkcji dodałem kolejny argument, w którym w momencie wywołania będziemy wysyłać czy jest  w pętli czy nie.

Napisz czy o takie coś chodziło :)

komentarz 9 października 2019 przez Pytajnikowiec Początkujący (290 p.)

Chodzi o to żeby zrobić to tak żeby linijka z iteracją była taka:

users.forEach(user => writeUser(user)

Nic tam nie mogę dodać inaczej byłoby to bardzo proste. Ciało funkcji musi sprawdzić czy jest w pętli

0 głosów
odpowiedź 9 października 2019 przez DawidK Nałogowiec (37,910 p.)

Coś takiego zadziała, ale nie jest to chyba najszczęśliwsze rozwiązanie:

const users = [
    {id: "4h23iu", name: "Foo"},
    {id: "j423io", name: "Bar"}
]

let inLoop = false;
 
function writeUser(user) {
    inLoop ? console.log('in loop') : console.log('outside loop');
    return user;
}

for(i=0;i<users.length;i++){
    inLoop = true;
    writeUser(users[i]);
    inLoop = false;
}

writeUser(users[0]);

 

komentarz 9 października 2019 przez Pytajnikowiec Początkujący (290 p.)

Kombinowałem z czym w stylu

const users = [
    {id: "4h23iu", name: "Foo"},
    {id: "j423io", name: "Bar"}
]
 
function writeUser(user) {
    if (typeof this === "object" && this.length) console.log("w pętli")
    else console.log("poza pętlą");
    
    return user;
}
 
users.forEach(user => writeUser.call(users, user)

ale kryteria są takie że nie mogę ruszyć linijki z users.forEach

komentarz 9 października 2019 przez ScriptyChris Mędrzec (190,190 p.)

kryteria są takie że nie mogę ruszyć linijki z users.forEach

Z jakiego powodu takie kryterium? 

0 głosów
odpowiedź 9 października 2019 przez DawidK Nałogowiec (37,910 p.)

druga próba ;)

const users = [
    {id: "4h23iu", name: "Foo"},
    {id: "j423io", name: "Bar"}
]

let inLoop = false;
 
function writeUser(user,inLoop) {
    inLoop ? console.log('in loop') : console.log('outside loop');
    return user;
}

writeUser(users[0]);

users.forEach((user,index,array) => writeUser(user,index < array.length));

writeUser(users[0]);

 

Podobne pytania

+1 głos
3 odpowiedzi 682 wizyt
pytanie zadane 1 czerwca 2018 w JavaScript przez xxx1990 Początkujący (490 p.)
0 głosów
1 odpowiedź 5,738 wizyt
0 głosów
0 odpowiedzi 1,928 wizyt

92,963 zapytań

141,928 odpowiedzi

321,161 komentarzy

62,297 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...