folder Tahribat.com Forumları
linefolder Html - CSS - XML - JavaScript - Ajax
linefolder Javascript'te Callback (Ve Asenkron Yapıda Global Değişken Değiştirme)



Javascript'te Callback (Ve Asenkron Yapıda Global Değişken Değiştirme)

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ozgunlu
    ozgunlu's avatar
    Banlanmış Üye
    Kayıt Tarihi: 11/Kasım/2011
    Erkek
    RockZs bunu yazdı
    ozgunlu bunu yazdı

    bele bişiler mi 

    http://stackoverflow.com/questions/494779/how-do-i-pass-multiple-arguments-into-a-javascript-callback-function

    hocam son console.log u setTimeOut içine alıp, biraz geç başlatınca çalışıyor. yani asenkron olunca böyle globale değişken atamalarla ilgili sorun yaşanıyor anladığım kadarıyla. daha önce de bunla birkaç kez karşılaştım ama bir şekilde hep üstesinden geldim, başka yollardan ama burada yapacak bişey yok. 

    aslında konu şurada anlatılmış : http://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of-a-function-asynchron

     

    hocam işte, 2 tane callback' i aynı fonksiyona bağlaman lazım. İkisinin de işi bitince o fonksiyonu çağırıp içine yazacaklar ama iki tanesi bir fonksiyona bağlanabiliyor mu bilmiyorum.


    Hello, i am nothing. I come from Neverland.
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RockZs
    RockZs's avatar
    Kayıt Tarihi: 30/Haziran/2002
    Erkek
    by_Tet bunu yazdı

    Asekronu şöyle düşün

    O-O-O

    Her yuvarlak bir fonksiyon her çizgi bir callback ve 

    3 yumurta 3 dkda pişerse 100 yumurta da 3 dkda pişer mantığını unutma

    Telefondayım ondan bu hikayeleştirme olayı fakat güzel bir link veriyim sana

    http://www.tahribat.com/forum/bir-mysql-sorum-ve-bir-de-nodejsmysql-sorum-uzm-208169

    Yanlış anladıysam mevzuyu özür diliyorum

    yok hocam mezvuuyu doğru anlamışsın da niyeyse ya ben anlayamıyorum, ya da (İsmailYK 'nın dediği gibi) benim anladığım beni anlamıyor. yani; ilk sorum başkaydı, onu callback olayı ile çözdüğümü sanıyordum, ki çözdüm gibi görünüyor ama bu kez bu callback fonk. larda get() ile aldığım verileri bir global değişkene yazdıramıyorum gibi görünüyor, aslında yazdırıyorum ama console.log her ne hikmetse bütün bu get işlemlerinden önce global değişkeni yazmaya çalıştığımdan boş bir değişken (array ya da object farketmiyor) veriyor. yani bu console.log u tüm get işlemlerinden sonra çalıştırmak gerek, onu yaptığımı sanıyordum ama yapamamışım.

     

  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    by_Tet
    by_Tet's avatar
    Kayıt Tarihi: 22/Mayıs/2012
    Erkek

    İşte hocam her halkadaki değişken o halkada kalır sen onları taşımak istiyorsan fonksiyonlara değişken atayacaksın

    ilkIslem()

    ikinciİslem(str,arr)

    sonIslem(str,arr) ve burada console log basacaksın

     


    iyibu! yeniden..
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RockZs
    RockZs's avatar
    Kayıt Tarihi: 30/Haziran/2002
    Erkek

    şimdi hocalarım çalışan fonksiyon şu:

    vars_will_send = {};
    
    function click_newVideo(new_ytid) {
    	
    	get_from_snippet();
    	
    	function get_from_snippet() {
    		$.get("https://www.googleapis.com/youtube/v3/videos", { 
    			part: "snippet", 
    			id: new_ytid,
    			key: api_key
    			}, function(data2) { 	
    				vars_will_send.url = (data2.items[0].snippet.thumbnails.default.url);
    				vars_will_send.title = data2.items[0].snippet.title.substring(0,44).replace(/['"]+/g, '');
    				vars_will_send.desc = data2.items[0].snippet.description.substring(0,88).replace(/['"]+/g, '');
    			}, get_from_contentDetails());
    	}
    
    	function get_from_contentDetails() {
    		$.get("https://www.googleapis.com/youtube/v3/videos", { 
    			part: "contentDetails", 
    			id: new_ytid,
    			key: api_key
    			}, function(data) { 	
    				vars_will_send.dur = data.items[0].contentDetails.duration;
    			}, send_new_video_datas());
    	}
    
    	function send_new_video_datas() {
    		setTimeout(function() {
    			console.log(vars_will_send);
    		}, Math.random() * 2000);	
    	}
    	
    }

    ama bunun sağlıklı çalışabilmesi için sondaki setTimeout'u kaldırıp, console.log'u öyle çalıştırmak gerek değil mi, yani bakarsınız get() ile gelen değerler setTimeout'un random değerinden daha geç gelir ve yine değişken boş gibi görünür.

    RockZs tarafından 06/Kas/15 21:51 tarihinde düzenlenmiştir
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    acemi-webci
    acemi-webci's avatar
    Kayıt Tarihi: 11/Haziran/2008
    Erkek
    function get_from_system(var) {
        $.get("https://www.websiteone.com", {
            id: var,
            key: api_key
            }, function(data) {    
    		
                var ab = data.items[0].contentDetails.foo;
                console.log(ab);
    			
    			$.get("https://www.websitetwo.com", {
    			id: var,
    			key: api_key
    			}, function(data2) {   
    				var ba = data2.items[0].contentDetails.bar;
    				console.log(ba);
    			});
    
            });
    }

     

    iç içe kullanınca işini görmüyor mu hocam?

    acemi-webci tarafından 06/Kas/15 21:31 tarihinde düzenlenmiştir

    ...
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    NoktaliVirgul
    NoktaliVirgul's avatar
    Kayıt Tarihi: 02/Temmuz/2007
    Erkek

    fonksiyonun dışında, scriptin ilk satırında bir değer tanımla. global oluyor.

    var sonuc;
    function test() {
    sonuc = "lorem";
    }
    test();
    alert(sonuc);


    If my calculations are correct, when this baby hits eighty-eight miles per hour... you"re gonna see some serious shit.
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RockZs
    RockZs's avatar
    Kayıt Tarihi: 30/Haziran/2002
    Erkek
    by_Tet bunu yazdı

    İşte hocam her halkadaki değişken o halkada kalır sen onları taşımak istiyorsan fonksiyonlara değişken atayacaksın

    ilkIslem()

    ikinciİslem(str,arr)

    sonIslem(str,arr) ve burada console log basacaksın

    hocam bunu da yaptım, ama sıkıntı şu; o sonda verdiğim console.log diğer fonksiyonlardan önce çalışıyor. boş değişken veriyor, ya da tekrar çalıştırdığımda bir önceki değeri veriyor hep.. yani callback ile sırayla çalıştığını düşündüğüm sistem aslında sırayla çalışmıyor. ya da sırayı karıştırdım, ama anlatılanlara göre doğru olması lazım.. kafam çok karışık.

    mesela aşağıdaki fonksiyon hep bir öncesinin değerlerini veriyor, ilk çalıştırdığımda da boş değer veriyor.

    var vars_will_send_url = "";
    var vars_will_send_title = "";
    var vars_will_send_desc = ""; 
    var vars_will_send_dur = "";
    				
    function click_newVideo(new_ytid) {
    	
    	get_from_snippet();
    	
    	function get_from_snippet() {
    
    		$.get("https://www.googleapis.com/youtube/v3/videos", { 
    			part: "snippet", 
    			id: new_ytid,
    			key: api_key
    			}, function(data2) { 	
    				vars_will_send_url = (data2.items[0].snippet.thumbnails.default.url);
    				vars_will_send_title = data2.items[0].snippet.title.substring(0,44).replace(/['"]+/g, '');
    				vars_will_send_desc = data2.items[0].snippet.description.substring(0,88).replace(/['"]+/g, '');
    			}, get_from_contentDetails(vars_will_send_url, vars_will_send_title, vars_will_send_desc));
    	}
    
    	function get_from_contentDetails(vars_will_send_url2, vars_will_send_title2, vars_will_send_desc2) {
    				
    		$.get("https://www.googleapis.com/youtube/v3/videos", { 
    			part: "contentDetails", 
    			id: new_ytid,
    			key: api_key
    			}, function(data) { 	
    				vars_will_send_dur = data.items[0].contentDetails.duration;
    			}, send_new_video_datas(vars_will_send_url2, vars_will_send_title2, vars_will_send_desc2, vars_will_send_dur));
    	}
    
    	function send_new_video_datas(vars_will_send_url3, vars_will_send_title3, vars_will_send_desc3, vars_will_send_dur2) {
    
    			console.log(vars_will_send_url3, vars_will_send_title3, vars_will_send_desc3, vars_will_send_dur2);
    	
    	}
    		
    }
    RockZs tarafından 07/Kas/15 11:29 tarihinde düzenlenmiştir
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RockZs
    RockZs's avatar
    Kayıt Tarihi: 30/Haziran/2002
    Erkek

    ÇÖZDÜM OLAYI :)

    function click_newVideo(new_ytid) {
    	
    	get_from_snippet();
    	
    	function get_from_snippet() {
    
    		$.get("https://www.googleapis.com/youtube/v3/videos", { 
    			part: "snippet", 
    			id: new_ytid,
    			key: api_key
    			}, function(data2) { 	
    				var vars_will_send_url = (data2.items[0].snippet.thumbnails.default.url);
    				var vars_will_send_title = data2.items[0].snippet.title.substring(0,44).replace(/['"]+/g, '');
    				var vars_will_send_desc = data2.items[0].snippet.description.substring(0,88).replace(/['"]+/g, '');
    				get_from_contentDetails(vars_will_send_url, vars_will_send_title, vars_will_send_desc);
    			}); 
    	}
    
    	function get_from_contentDetails(vars_will_send_url2, vars_will_send_title2, vars_will_send_desc2) {
    				
    		$.get("https://www.googleapis.com/youtube/v3/videos", { 
    			part: "contentDetails", 
    			id: new_ytid,
    			key: api_key
    			}, function(data) { 	
    				var vars_will_send_dur = data.items[0].contentDetails.duration;
    				send_new_video_datas(vars_will_send_url2, vars_will_send_title2, vars_will_send_desc2, vars_will_send_dur);
    			}); 
    	}
    
    	function send_new_video_datas(vars_will_send_url3, vars_will_send_title3, vars_will_send_desc3, vars_will_send_dur2) {
    
    			console.log(vars_will_send_url3, vars_will_send_title3, vars_will_send_desc3, vars_will_send_dur2);
    	
    	}
    		
    }

    sorun callback'leri yanlış yerde çağırmamdan kaynaklanıyormuş. değişkene atama işlemi ile callback çağırmayı aynı yerde yapıyormuşum. artık önce değişkenleri atadıktan sonra (ki aslında asenkron mantığa göre değişkenleri atarken aynı anda callback çağırıyor olması lazım ama burada sanki önce değişkenleri atıyor ve daha sonra callback'e gidiyor, herhalde zaman almayan işlemler için senkron mantıkla yazabiliyoruz) callback çağırıyorum.

    yukarıdaki kod çalışıyor. burada By_TeT in dediği şekilde (yani değişkenleri fonksiyonlara göndererek) yaptım ama sanırım artık global bir değişken üzerinde değişiklik yapınca da olması lazım.

    fikir beyan ve yardım eden herkese çok teşekkür ederim.

    RockZs tarafından 07/Kas/15 12:35 tarihinde düzenlenmiştir
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Gzx
    Gzx's avatar
    Kayıt Tarihi: 23/Ağustos/2005
    Erkek

     

        $.when(get_from_system1(), get_from_system2()).done(function(a1, a2){
            console.log(a1[0], a2[0]);
        });
    
    
        function get_from_system1(id) {
            return $.get("https://www.websiteone.com", {
                id: id,
                key: api_key
            });
        }
        function get_from_system2(id) {
            return $.get("https://www.websitetwo.com", {
                id: id,
                key: api_key
            });
        }


    sanirim boylesi daha rahat ve daha okunabilir :)


    "açık mı var la" yazdı diye ban yiyen adam !
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RockZs
    RockZs's avatar
    Kayıt Tarihi: 30/Haziran/2002
    Erkek
    Gzx bunu yazdı

     

        $.when(get_from_system1(), get_from_system2()).done(function(a1, a2){
            console.log(a1[0], a2[0]);
        });
    
    
        function get_from_system1(id) {
            return $.get("https://www.websiteone.com", {
                id: id,
                key: api_key
            });
        }
        function get_from_system2(id) {
            return $.get("https://www.websitetwo.com", {
                id: id,
                key: api_key
            });
        }


    sanirim boylesi daha rahat ve daha okunabilir :)

    hocam çok teşekkür ederim, bu yöntemi ilk defa gördüm, daha önce hiç $.when kullanmamıştım ama çok yararlı olabilir.

Toplam Hit: 1425 Toplam Mesaj: 21
seveseve