我有以下代碼:承諾
function load(lab, el) {
return Promise.all([Util.loadHtml(lab), Util.loadScript(lab)])
.then(function(responses) {
parse(responses[0], el, responses[1]);
});
}
function parse(html, parent, context) {
var children = [].slice.call(html.childNodes).filter(function (item) { return item.nodeType === 1 || item.nodeType === 3; });
for (var i = 0; i < children.length; i++) {
var child = children[i];
if (child.tagName.indexOf('-') >= 0) {
load(child.tagName.toLowerCase(), parent);
}
else {
var parsedNode = parseNode(child, context);
parent.appendChild(parsedNode);
if (child.hasChildNodes())
parse(child, parsedNode, context);
}
}
}
基本上,這是它應該做的:
- 在我app.js我稱之爲
load
功能,也將導入2文件,一個html
和一個js
,當這些請求的承諾是fullfilled,它調用了一個名爲parse
功能,這將循環到HTML和將解析一些字符串,在JS文件中聲明的類。 - 在循環內部,可以找到一些自定義標記,例如
<my-element>
,然後它將嘗試加載my-element.html
和my-element.js
,並且它也會在該HTML內循環。 - 正如你可以在代碼中看到,我通過家長和背景,所以在完成所有的環圈後,「大」家長應該有它裏面的所有其他組件。
問題
由於load
函數返回一個承諾,我打電話同步,它立即返回,因爲這個原因,孩子不放在正確的家長裏。
如果我是用C#或者用ES7 async
和await
這樣的關鍵字來做這件事,那很簡單。但我不知道怎樣才能異步調用load
函數。任何猜測?
我看不出它是如何將它放入不正確的父項,因爲它是「異步」。 – MinusFour
呃,如果你也在過濾文本節點,你不應該訪問他們的'.tagName'而不檢查它是否是一個元素。 – Bergi
@Bergi其實我的代碼比這個要大得多。我已經簡化了它的上下文我的問題 - 我檢查節點的類型等:) – Buzinas