2011-03-16 42 views
1

我有一個異步調用,當它完成時,我想在父級上設置一個屬性。從異步調用訪問另一個對象原型的對象

採取以下類,貓:

var cat = function(){ 
    this.isLoaded = false; 
    this.image = new Image(); 
    this.image.onload = function(){ 
    //how can I set the isLoaded variable above from here?? 
    } 
    this.image.src = "..."; 
} 

我希望能夠做到:

var myCat = new cat(); 
if(myCat.isLoaded) 
.... 

我似乎無法弄清楚如何設置上述從onload事件中的isLoaded屬性。我可以通過只是做'isLoaded'來訪問它,但我認爲我是通過價值訪問它,而不是參考,因此不能改變它。

這似乎是一個簡單的解決方案,我想我缺乏更深入的瞭解。

謝謝!

回答

3

onload回調中,isLoadedundefined,如果你設置它,它將是window.isLoaded(本質上是一個全局)。

該回調的this也指向img元素,而不是其父功能。我做了一個that變量,指向外部函數的this。函數中的函數可以在JavaScript中訪問其外部函數的作用域。

var Cat = function(){ 
    this.isLoaded = false; 
    this.image = new Image(); 
    var that = this; 
    this.image.onload = function(){ 
    that.isLoaded = true; 
    } 
    this.image.src = "http://www.gravatar.com/avatar/5e28492984e3056904e295c43337655f?s=32&d=identicon&r=PG"; 
} 

var c = new Cat(); 

console.log(c.isLoaded); // false 

setTimeout(function() { console.log(c.isLoaded) }, 1500); // true 

jsFiddle

當然,setTimeout()僅用於此示例。如果你正在加載圖片,你應該依靠回調,因爲唯一的另一種方式來確定圖片是否加載是通過輪詢 - 不是一個很好的界面。

你應該提供一個發生在一個回調來傳遞,所以你可以做...

var c = new Cat(function() { 
    // Image loaded, proceed. 
}); 
+0

確定,所以,以確保我正確地理解這樣一個例子 - 在一個函數的函數可以訪問外部函數/對象的本地/私有「變量(通過聲明var a)而不是附加到函數本身的對象? (通過this.a) – Steve 2011-03-16 19:07:54

+0

@Steve它可以訪問它的父範圍,但'this'的值會改變,所以你需要一個參考。 – alex 2011-03-16 23:07:34

1

就像@alex說你需要引用你的貓對象。

但是,如果你的互聯網連接不好setTimeout不會幫你很多。 下面是使用回調功能代替的setTimeout

var cat = function (callback) { 
    var this_cat = this; 
    this.isLoaded = false; 
    this.image = new Image(); 
    this.image.onload = function(){ 
    //how can I set the isLoaded variable above from here?? 
    this_cat.isLoaded = true; 
    if (callback instanceof Function) { //@alex tip: callback instanceof Function is more accurate. Chrome reports the regex literal is a function. 
     callback(); 
    } 
    } 
    this.image.src = "/images/stand_logo.png"; 
} 

var myCat = new cat(function() { 
    console.log('cat loaded'); 
}); 
+0

我只在這個例子中使用了'setTimeout()'。 – alex 2011-03-16 07:33:17

+2

要確定回調是否是函數,'callback instanceof Function'更準確。 [jsFiddle](http://jsfiddle.net/alexdickson/Kuxv9/) - > Chrome報告正則表達式是一個函數。 – alex 2011-03-16 07:38:08

+0

謝謝,很好的通知,我會改變我的答案 – 2011-03-16 07:42:02