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

wykrycie przebiegu pętli

0 głosów
85 wizyt
pytanie zadane 4 dni temu w JavaScript, jQuery, AJAX przez Pytajnikowiec Nowicjusz (190 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ź 4 dni temu przez Comandeer Mentor (464,420 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 4 dni temu przez JSHolic Szeryf (81,260 p.)

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

0 głosów
odpowiedź 4 dni temu przez Michałełe Obywatel (1,980 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 4 dni temu przez Pytajnikowiec Nowicjusz (190 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ź 4 dni temu przez DawidK Gaduła (3,770 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 4 dni temu przez Pytajnikowiec Nowicjusz (190 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 4 dni temu przez JSHolic Szeryf (81,260 p.)

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

Z jakiego powodu takie kryterium? 

0 głosów
odpowiedź 4 dni temu przez DawidK Gaduła (3,770 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 121 wizyt
pytanie zadane 1 czerwca 2018 w JavaScript, jQuery, AJAX przez xxx1990 Początkujący (430 p.)
0 głosów
1 odpowiedź 1,467 wizyt
Porady nie od parady
Nie wiesz jak poprawnie zredagować pytanie lub pragniesz poznać którąś z funkcji forum? Odwiedź podstronę Pomoc (FAQ) dostępną w menu pod ikoną apteczki.FAQ

66,984 zapytań

113,890 odpowiedzi

241,334 komentarzy

46,942 pasjonatów

Przeglądających: 229
Pasjonatów: 9 Gości: 220

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...