我正在与Google的Blockly进行项目合作,但部分文档令人难以理解。有人可以帮助我了解以下for循环的结束条件(xml = allXml [i])吗?

var allXml = Blockly.Xml.workspaceToDom(workspace);
var allCode = [];
for (var i = 0, xml; xml = allXml[i]; i++) {
  var headless = new Blockly.Workspace();
  Blockly.Xml.domToWorkspace(headless, xml);
  allCode.push(Blockly.JavaScript.workspaceToCode(headless));
  headless.dispose();
}


我想当未定义allXml [i]时,循环将退出,但是如何遍历这样的XML对象呢?似乎总是返回undefined并完全跳过循环。

谢谢你的帮助

有关大多数功能的定义,请参见https://code.google.com/p/blockly/source/browse/trunk/core/xml.js?r=1614

我从中提取的文档页面是https://developers.google.com/blockly/custom-blocks/code-structure?hl=en

最佳答案

我在github的存储库中找不到此代码,因此我认为它是文档中较旧的示例。

但是,如果您看一下Blockly.Xml.workspaceToDom()函数的实现,您会在那看到非常相似的东西。

  var blocks = workspace.getTopBlocks(true);
  for (var i = 0, block; block = blocks[i]; i++) {
    var element = Blockly.Xml.blockToDom_(block);
    //...
    xml.appendChild(element);
  }


这里的想法是遍历所有代码分支。最上面的块没有最上面的连接(它将启动一个新的分支)。 getTopBlocks()返回一个数组{!Array.<!Blockly.Block>}

考虑到文档在有关并行执行的部分中进行了介绍,我认为这与以下事实有关:您可以拥有更多未连接的代码分支……确切的实现随时间而改变。

07-24 09:47