• 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
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

66,984 zapytań

113,890 odpowiedzi

241,331 komentarzy

46,940 pasjonatów

Przeglądających: 235
Pasjonatów: 13 Gości: 222

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.

...