2

我正在使用 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

4

2 回答 2

1

我在github上的 repo 中找不到此代码,所以我想这是文档中的一个较旧的示例。

但是如果你看一下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>}

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

于 2016-02-01T16:46:16.287 回答
0

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

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

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

于 2019-09-14T14:08:02.947 回答