Html - CSS - XML - JavaScript - Ajax
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)
-
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.
-
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.
-
İş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
-
ş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 -
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 -
fonksiyonun dışında, scriptin ilk satırında bir değer tanımla. global oluyor.
var sonuc;
function test() {
sonuc = "lorem";
}
test();
alert(sonuc); -
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 -
ÇÖ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 -
$.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 :) -
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.