2009-11-11 26 views
1

代碼示例:在ActionScript 3,如何可以通過數組的當前值在一個循環中一個事件監聽器

var gospels : Array = ["john", "mark", "matthew", "paul"]; 

for each (var book : String in gospels) 
{ 
    var loader : URLLoader = new URLLoader(); 
    loader.load(new URLRequest("http://example.com/" + name)); 

    trace(book) // outputs current value of array 

    loader.addEventListener(Event.COMPLETE, function(e : Event) : void { 
    trace(book); // prints paul 4 times 
    }); 
} 

我怎樣才能獲得該事件偵聽器來使用的數組的值循環何時調用事件偵聽器的函數?即當我在事件監聽器函數內部調用跟蹤時,我怎樣才能得到它輸出"john","mark",​​和"paul"

+0

編輯Loader.load()方法正確地使用新的URLRequest()對象 –

回答

4
var gospels:Array = ["john", "mark", "matthew", "paul"]; 

for each (var item:String in gospels) 
{ 
    (function(book:String){ 
    var loader : URLLoader = new URLLoader(); 
    loader.load(new URLRequest("http://example.com/" + name)); 

    trace(book) // outputs current value of array 

    loader.addEventListener(Event.COMPLETE, function(e:Event):void { 
     trace(book); // prints paul 4 times 
    }); 
    }(item)); 
} 
+1

Loader.load方法( 「http://example.com/」 +名稱);應該是loader.load(新的URLRequest(「http://example.com/」+ name));雖然不錯,但並不像我認爲的那樣高級。 – greggreg

+0

修改了答案以反映greg的評論。謝謝格雷格。 –

+0

坦克利奧,像冠軍一樣工作。 –

2

我覺得更優雅的方式是寫的URLLoader像一個超:

class MyURLLoader extends URLLoader { 
    public var book:String; 

    function MyURLLoader(aBook:String){ 
    book = aBook; 
    super(); 
    } 
} 

,然後在循環中使用這個類,如:

var gospels : Array = ["john", "mark", "matthew", "paul"]; 

for each (var book : String in gospels) 
{ 
    var loader : MyURLLoader = new MyURLLoader(book); 
    loader.load(new URLRequest("http://example.com/" + name)); 

    trace(book) // outputs current value of array 

    loader.addEventListener(Event.COMPLETE, function(e : Event) : void { 
    var myUrlLoader:MyURLLoader = e.target as MyURLLoader; 
    trace (myUrlLoader.book); 
    }); 
} 

附:我目前沒有使用閃存的電腦後面,所以我沒有機會檢查代碼。

+0

也是一個有效的解決方案。 +1。但是,請注意,將問題視爲範圍相關,如果可以使用閉包或通過將循環的主體分離爲另一個函數來創建整個類,則可能稍微矯枉過正。 –

+0

我同意Lior所說的,包括+1 :) –

1

邁克爾·布魯爾 - 戴維斯回答和變體,但在這裏使用Array.forEach以這種方式引入新的變量book每次迭代:

var gospels : Array = ["john", "mark", "matthew", "paul"]; 

gospels.forEach(function (book: String, i: int, a: Array): void { 
    var loader : URLLoader = new URLLoader(); 
    loader.load(new URLRequest("http://example.com/" + name)); 

    trace(book) // outputs current value of array 

    loader.addEventListener(Event.COMPLETE, function(e : Event) : void { 
    trace(book); 
    }); 
}); 
0

下面是做到這一點的最快最好的結構化的方式(IMO):

var gospels:Array = ["john", "mark", "matthew", "paul"]; 

for(var book:String in gospels){ //For is faster than for each 
    var loader:URLLoader = new URLLoader(); 
    //It's good practise to add the event listener before calling the function 
    loader.addEventListener(Event.COMPLETE, loaderComplete(book), false, 0, true); 
    loader.load(new URLRequest("http://example.com/" + name)); 
} 

function loaderComplete(book:String):Function{ 
    return function(event:Event):void{ 
     event.target.removeEventListener(Event.COMPLETE, arguments.callee); 
     trace(book); 
    } 
} 
+0

爲什麼如果只有弱引用,您需要顯式刪除偵聽器? –

+0

這是我的習慣。我想表明,即使它是匿名函數,也可以刪除參考。 – rzetterberg

相關問題