2016-04-07 30 views
-1

Aşağıdaki sorun üzerinde çok uzun bir süre boyunca sıkışmış durumdayım ve Javascript'teki değişken kapsam ve geri arama işlevleri hakkındaki teorik bilgilerimi gerçekten dikkate almam gerekiyor. Benim problemim için hızlı bir düzeltmeden ziyade, benim problemimin arkasındaki teoriyi açıklamaya çalışan genel bir cevap tercih edilir. İşte kod (çalışmıyor) (oh ve jQuery'nin $ .getJSON kullanır). JavaScript geri çağırma işlevleri ile değişken kapsamını ve kapanışları anlama

function getStreamerStatus(streamer) { 
    var channelurl = "https://api.twitch.tv/kraken/channels/"; 
    var streamurl = "https://api.twitch.tv/kraken/streams/"; 
    var temporary = { 
    status: "", 
    game: "", 
    picture: "", 
    name: streamer, 
    link: "https://www.twitch.tv/" + streamer 
    }; 

    $.getJSON(streamurl + streamer, createCallback(temporary)); 
    $.getJSON(channelurl + streamer, createCallback(temporary)); 

    return temporary; 
} 

Bazı arama yaptıktan sonra ben "geçici" geri arama işlevi görebileceği nesne yapmak için bir girişim "createCallback()" fonksiyonu kullanılır.
function createCallback(tmpobj) { 
    return function(json) { 
    //get's some information and stores it in the object passed as tmpobj 
    filterOut(json, tmpobj); 
    }; 
} 

ve ana işlevi sonunda

I seğirme flamalar isimlerini içeren bir dizi ve her biri adı "getStreamerStatus()" fonksiyonu olarak adlandırılır ve döndürülen bir amacı bir dizi depolanır.

function TwitchInit() { 
    var channels = [/*filled with strings of streamer names*/]; 
    var response = []; //array with objects with all the information 

    for(var i = 0; i < channels.length; i++) { 
    response.push(getStreamerStatus(channels[i])); 
    } 
    parseContent(response); //not relevant for now 

    //for debugging 
    for(var j = 0; j < response.length; j++) { 
    console.log("--responseArray with Objects--"); 
    for(var prop in response[j]) { 
     if(response[j].hasOwnProperty(prop)) { 
     console.log(prop + ": " + response[j][prop]); 
     } 
    } 
    } 
} 

Buradaki sorun ben konsolda sadece "bağlantı" ve nesnelerin "ad" özelliklerine nesneleri giriş yaparsanız bazı içerik ve yazılmalı zannediyorsunuz diğer özelliklere sahip olmasıdır " filterOut() "işlevi her zaman boş kalır. Konsola göre, Twitch sunucusu ile iletişim iyidir ve yanıt üstbilgisini/nesnesini konsoldan okuyabiliyorum, böylece kural dışıdır. Ayrıca, "ad" ve "link" özellikleri de her konsolda her defasında farklı olduğu için, her defasında yeni bir nesnenin oluşturulduğu anlamına gelir. Bu, "geçici" nesnesinin, nesnenin "filterOut()" işlevine görünür hale getirilmesi için "createCallback()" ile yapılan girişime rağmen $ .getJSON içinde geri arama işlevi için hala bir şekilde görülemeyeceği sonucuna götürür. JavaScript'in değişken kapsamı hakkında birçok bilgi buldum ancak şu ana kadar sorunumu çözmeme yardımcı olmadı. Burada yanlış yaptığım konusunda hiçbir fikrim yok ve hayal kırıklığına uğramaya başlıyorum. Umarım birileri beni burada aydınlatır.

+0

Yeni geçici(), 'createCallback() işlevine bir argüman olarak 'deneyin, böylece ilk sorgudaki sonuçlar ikincinin üzerine yazılmaz. Ayrıca, 'createCallback()' işlevi bir işlevi döndürür (özellikle işlev hiç çalışmadığı için bir işlevin çıktısını değil). Json'un değerinin nereden geldiğini göremiyorum. 'CreateCallback' kesinlikle bunun ne olduğunu bilmiyor. Gönderiniz, almayı düşündüğünüz çıktının biçimini ve aldığınız çıktıyı da içermelidir. – LinuxDisciple

+0

İşlev filtresini da gösterebiliyor musunuz? Verilerinizi dolduran biri gibi görünüyor – user3

+0

@ user3 Daha önce vardı, sonra kaldırıldı. İsterseniz düzenleme geçmişinde. Eminim asla koşmaz. – LinuxDisciple

cevap

0

Burada bir sorun yok diye düşünüyorum, tek sorun, getStreamerStatus işlevinizin async görevlerini yerine getirmesi, ancak doğrudan bir değer döndürmesi ve async çağrılarını (getJSON) tamamlanmasını beklemeden kullanmasıdır. böylece daha iyi şeyler sadece sizin getStreamerStatus yazarsın bundan etmek

) getJSON aramaları geri arama ile, önce değil, yapıldıktan sonra verileri döndürür;

deneyin Eğer birkaç saniye gecikme ile bir setTimeout içine günlükleri hata ayıklama koymak parametre olarak veya bir söz verdiğinizde. Veya işlevinize çağrıların tamamlandığını ve sonuçların işlenebileceğini bildiren bir şey (yani: bir olay) olması gerekir.

+0

"getStreamerStatus()", her iki geri aramalar geri gelene kadar bekledi ve "getCallBack()"/'filterOut()" başarıyla "geçici" olarak değiştirilse bile, hala yalnızca bir 'geçici 'nesnesi var Böylece, bir seferde yalnızca bir işlemin sonuçlarını tutabilirdi. – LinuxDisciple

+0

evet, ancak istek 2 değişik URL üzerindedir, bu nedenle, bir kaynaktan, bir diğerinden bazı bilgileri almak ve bunu bir nesneye, "geçici" olana dönüştürmek, aksi halde evet kazandı beklendiği gibi çalışıyorum ama – user3

+1

@ user3'ü bilmek için çok fazla detay kaçırıyorum. Detayların eksikliğinden dolayı üzgünüm, çok fazla detayın kök sorunundan uzaklaşacağını düşündüm. Ancak bazı aramalardan sonra burada çok iyi bir cevap buldum: http://stackoverflow.com/a/14220323/5754117 temelde sorumu geçersiz kılıyor. Ama yine de yardımcılar için teşekkürler;) Async çağrılarıyla doğru yönde işaret ediyordunuz. –

İlgili konular