2016-08-30 9 views
0

私はここにあるIonSound.jsというサウンドプレーヤーを使用しています。 http://ionden.com/a/plugins/ion.sound/en.html外部スコープイベントでPromise.fulfillをトリガーする

文書によると、私はそうのようなsound.endedイベントをリッスンすることができます

ion.sound({ 
    sounds: [ 
     {name: "door_bump"}, 
     {name: "water_droplet_2"}, 
     {name: "water_droplet_3"} 
    ], 
    ended_callback: function (sound) { 
     // sound ended 
     game.sound.soundEnded(sound); 
    } 
}); 

私はこれの上に非常に基本的なラッパーをしました。今

class Sound 
{ 
    constructor(ion) { 
     this.ion = ion; 
     this.promises = {}; 
    } 

    play(sound) { 
     if (game.settings.muted === false) { 
      this.ion.sound.play(sound); 
     } 

     this.promises[sound] = new Promise((accept, reject) => { 

     }); 

     return this.promises[sound]; 
    } 

    soundEnded(sound) { 
     if (this.events.hasOwnProperty(sound.name) === true) { 
      Promise.resolve(this.promises[sound.name]) 
     } 
    } 
} 

、私は次のコードを実行すると:

game.sound.play("level-up"); 

ended_callbackトリガを。その後、sound.soundEndedが呼び出されます。

問題は、それほど混乱することです。私が代わりにやりたいことは、私はそうのようにそれを使用することができますので、私のSoundクラスをpromisifyingです:

game.sound.play("level-up").then(() => { 
    console.log("Sound is over."); 
}); 

をそれを行うためには、コードのこの作品は、私がthis.promisesハッシュに保たれ、私の約束をfulfill()する必要があります。

Promise.resolve(this.promises[sound.name]); 

が、それはこのように果たすトリガするために任意のメソッドを持っていません。

this.promises[sound.name].fulfill(); 

任意のアイデア?

答えて

3

約束事の配列をthis.promisesに保存する代わりに、約束の受け入れ/拒否コールバックの配列をthis.promiseFulfilに入れてください。そうすれば、あなたは約束を果たすための手口を持っています。ここで

は、あなたのクラスがどのように見えるかです:

class Sound 
{ 
    constructor(ion) { 
     this.ion = ion; 
     this.promiseFulfil = {}; 
    } 

    play(sound) { 
     if (game.settings.muted === false) { 
      this.ion.sound.play(sound); 
     } 

     // Just return the promise without storing it.  
     return new Promise((accept, reject) => { 
      // keep track of which function to call to fulfil promise: 
      this.promiseFulfil[sound] = { accept, reject }; 
     }); 
    } 

    soundEnded(sound) { 
     if (this.promiseFulfil[sound]) { 
      // call the appropriate promise-callback: 
      this.promiseFulfil[sound].accept(); 
      // optionally clear this entry: 
      this.promiseFulfil[sound] = undefined; 
     } 
    } 
} 
+0

あなたが素晴らしいです。神はあなたのdogeを祝福! – Aris

関連する問題