У меня есть следующий код для запроса устройства MIDI и ожидания ответа на него:
function awaitReply(msg=null, timeout=5000) {
return new Promise(resolve => {
midiIn.onmidimessage = msgg => {resolve(msgg);}
if (msg!=null){ midiOut.send(msg);}
setTimeout(() => {resolve({data:null}); }, timeout);
});
}
async function sendMIDImessage(){
let res = await awaitReply([0xF0, 0x52, 0x00, 0x6E, 0x09, 0x00, 0x00,0x00, 0xF7]);
//Do something
}
Этот код очень хорошо работает в нормальных условиях, но имеет один недостаток. Иногда устройство отвечает более чем одним сообщением, которое остается в очереди. Когда я спрашиваю снова, я получаю остаток от предыдущего ответа (который я просто хочу игнорировать, потому что я не вижу, как обрабатывать несколько ответов), и существует постоянное смещение. Я хотел бы иметь возможность очистить события перед отправкой нового. Что я пробовал:
function awaitReply(msg=null, timeout=5000) {
while (midiIn.onmidimessage=mssg=>{return mssg.data.length>0){dump=mssg.data}
return new Promise(...);
}
Не элегантное решение и не работает. Удаление прослушивателя событий также не работает.
Что работает, но слишком медленно: EDIT: он слишком медленный из-за тайм-аута (поэтому я могу уменьшить его до 1 мс, потому что MIDI-сообщения уже в очереди)
async function sendMIDImessage(){
var dump=await awaitReply(null,5000)!
while (dump!=null){
dump=await awaitReply(null,5000);
}
let res = await awaitReply([0xF0, 0x52, 0x00, 0x6E, 0x09, 0x00, 0x00,0x00, 0xF7]);
//Do something
}
Я чувствую, что должно быть более простое решение моего обходного пути. Как очистить прослушиватель событий midiIn.onmidimessage
?
Не стесняйтесь добавлять предложения о моем методе решения этой проблемы общения