这很令人烦恼。从下面的代码注释中可以看出,干净的方式失败了但是凌乱的方式成功了。
但是这种混乱的方式肯定是在幕后做干净的方式。
但显然必须有所不同!
发生了什么事?
function onSuccess( access )
{
log("requestMIDIAccess -- granted!");
midiAccess = access; // for persistence over closure
var inputs = midiAccess.inputs;
var gotOne = false;
if (inputs.length === 0)
log( "No MIDI inputs detected. Maybe reload Chrome THEN connect?" );
else {
// var inputs = midiAccess.inputs.values(); // A WORKS
// for ( var input = inputs.next(); input && !input.done; input = inputs.next())
for ( input in midiAccess.inputs.values() ) // B FAILS
{
input.value.onmidimessage = myMIDIMessagehandler;
gotOne = true;
}
if( ! gotOne ) log( "Need at least one MIDI input" );
}
编辑:现在使用for..of
和var input
,但仍然失败。
编辑:我正在使用https://github.com/cwilso/WebMIDIAPIShim - 这是access
对象的来源。
答案 0 :(得分:1)
for..in 语句以任意顺序迭代对象的可枚举属性。可能不是你想要的
看起来像midiAccess.inputs.values();是ES6迭代器?如果是这种情况,您可以使用
for (var input of midiAccess.inputs.values())
答案 1 :(得分:0)
试试for (var input in midiAccess.inputs.values() )
。
你必须得到delcare输入。
答案 2 :(得分:0)
我需要将input.value.onmidimessage
更改为input.onmidimessage
,然后才有效!
for ( var input of midiAccess.inputs.values() )
{
log( "Input: " + input );
input.onmidimessage = myMIDIMessagehandler;
gotOne = true;
}
if( ! gotOne ) log( "Need at least one MIDI input" );