不寻常的JavaScript for loop,在Blockly中使用xml

Unusual JavaScript for loop with xml in Blockly

本文关键字:Blockly xml JavaScript for loop 不寻常      更新时间:2023-09-26

我正在与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 对象?它似乎总是返回未定义并完全跳过循环。

谢谢你的帮助

大多数函数的定义可以在 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>}

考虑到文档在有关并行执行的部分中显示了它,我认为它将与以下事实有关,即您可以拥有更多未连接的代码分支......确切的实现会随着时间的推移而改变。

根据代码,Blockly.Xml.workspaceToDom(workspace)的返回类型为 {!Element}

它基本上返回使用 goog.dom.createDom('xml'); 创建的 DOM 节点。对于每个顶级块,它都会附加一个 DOM 节点。

所以基本上有问题的代码片段正在循环遍历与顶级块对应的所有 DOM 节点。