• 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
335 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 (599,730 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 447 wizyt
pytanie zadane 1 czerwca 2018 w JavaScript przez xxx1990 Początkujący (490 p.)
0 głosów
1 odpowiedź 5,595 wizyt
0 głosów
0 odpowiedzi 1,760 wizyt

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...