2016-10-12 3 views
0

Grundsätzlich muss ich in Coffeescript ein Argument an eine anonyme Funktion übergeben, und mir sind die Ideen ausgegangen.Wie übergeben Sie Argumente an anonyme Funktion in Coffeescript?

Dies ist mein Code:

audio = { 
     sounds: {}, 
     sources: [{ 
      wind: 'sounds/wind.mp3' 
     }], 
     load: (callback) -> 
      this.totalFiles = Object.size(this.sources[0]) 
      for key of this.sources[0] 
       sound = new Howl({ src: [this.sources[0][key]] }) 
       self = this 
       sound.once('load', (key) => 
        (key) -> 
         self.sounds[key] = this 
         if Object.size(self.sounds) == self.totalFiles 
          if typeof callback == 'function' then callback() 
       (key)) <- THIS ARGUMENT PASSING DOES NOT COMPILE CORRECTLY 
     loop: (name) -> 
      this.sounds[name].loop(true) 
      console.log this.sounds 
    } 

Der Code mit callback.call():

load: (callback) -> 
    this.totalFiles = Object.size(this.sources[0]) 
    for key of this.sources[0] 
     sound = new Howl({ src: [this.sources[0][key]] }) 
     self = this 
     sound.once('load', (key) => 
      callback.call(() -> 
       self.sounds[key] = this 
       if Object.size(self.sounds) == self.totalFiles 
        if typeof callback == 'function' then callback() 
      , key) 
     ) 

Mit callback.call() oder callback.apply() ich das gleiche Ergebnis zu erhalten, das gleiche kompilierte Javascript. Ich habe versucht, (Schlüssel), wo ich es in bereits kompiliertem Javascript brauchte, hinzuzufügen, und es hat wie beabsichtigt funktioniert.

Objektgröße:

Object.size = (obj) -> 
     size = 0 
     for key in obj then if obj.hasOwnProperty(key) then size++ 
     return size 

Ein guter Helfer Funktion fand ich auf Stackoverflow.

+0

WTH ist 'Object.size'? –

+0

Object.size im Post-Body hinzugefügt. Grundsätzlich ist es eine Funktion, die die Größe eines Objekts berechnet, ich habe es auf Stackoverflow gefunden. –

Antwort

0

Dies hat den Trick für mich:

sound.once('load', ((key) => 
    () -> 
     self.sounds[key] = this 
      if Object.size(self.sounds) == self.totalFiles 
       if typeof callback == 'function' then callback() 
     )(key) 
    ) 
0

Ihr Code hat einige Probleme, die wahrscheinlich sind das eigentliche Problem versteckt:

  • inkonsistente Einzüge
  • self = this der Rückruf zu sound.once ist eine fette Pfeil Funktion, dass die Linie self.sounds[key] = this diese und Selbst Bedeutung sind gleich
  • Aufnahme von vielen unnötigen Klammern.
  • Inkonsistente Verwendung von Kommas in Objekteigenschaftsdefinitionen.

AFAIK das eigentliche Problem ist, dass Sie eine IIFE nennen sind, und lassen Sie benötigen Pars:

sound.once('load', ((key) => 
    (key) -> 
     self.sounds[key] = this 
     if Object.size(self.sounds) == self.totalFiles 
      if typeof callback == 'function' then callback() 
)(key)) 

Außer, dass Sie haben key den Namen über verwendet. Sie haben eine Funktion, die Sie teilweise mit einem Parameter namens Schlüssel anwenden, und dann die zurückgegebene Funktion auch nimmt einen Parameter namens key? Welches ist es?

+0

Ich habe Ihren Code ausprobiert, die vorherige Ausnahme ist verschwunden, aber das zurückgegebene Objekt ist null. –

+0

console.log this.sounds -> returns Objekt {undefined: o} –

+0

Das ist, weil Schlüssel nicht definiert ist, siehe mein Update, das ich gerade gemacht habe. –

Verwandte Themen