for(X in X)失败,但完全写出来成功

时间:2015-07-27 22:58:14

标签: javascript iterator

这很令人烦恼。从下面的代码注释中可以看出,干净的方式失败了但是凌乱的方式成功了。

但是这种混乱的方式肯定是在幕后做干净的方式。

但显然必须有所不同!

发生了什么事?

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..ofvar input,但仍然失败。

编辑:我正在使用https://github.com/cwilso/WebMIDIAPIShim - 这是access对象的来源。

3 个答案:

答案 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" );