2016-08-30 2 views
0

Я использую звуковой плеер под названием IonSound.js, который можно найти здесь. http://ionden.com/a/plugins/ion.sound/en.htmlTriggering 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.

Проблема в том, что это становится беспорядком. То, что я хочу сделать вместо этого promisifying мой звук класс, так что я могу использовать его так:

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

Для того, чтобы сделать это, этот кусок кода должен fulfill() мое обещание, что я держал на this.promises хэш.

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

, но он не имеет каких-либо методов, чтобы вызвать выполнить так:

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

Есть идеи?

ответ

3

Вместо того, чтобы хранить массив обещаний в this.promises, сохраните массив обещаний accept/reject-callback в 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

Вы удивительно. Бог благословит ваш дож! – Aris

Смежные вопросы