异步追加元素
Append elements asynchronously
我正在尝试根据查询结果创建元素并将它们放入相应的 p
容器中。问题是所有元素最终都在最后一个容器中,而不是它们应该在的地方。
app.Controller.prototype.doReadOnlyDefault = function() {
var def = $.Deferred();
app.db.transaction(function(tx) {
tx.executeSql("SELECT * FROM table", [], function(tx, res) {
var len = res.rows.length;
var div = document.createElement("div");
if (len !== 0) {
var li = document.createElement("li");
var lbl = document.createElement("label");
lbl.textContent = res.rows.item(0).label;
lbl.id = 'lbl' + res.rows.item(0).id;
for (var i = 0; i < len; i++) {
var item = res.rows.item(i);
var pLu = document.createElement("ul");
var txt = document.createElement("p");
//yrdy
app.checkinController.doDependent(id).done(function(val) {
if (val) {
pLu.className = "moc-checkin-field-group moc-checkin-name-group moc-checkin-field-readonly";
pLu.appendChild(val);
}
});
txt.appendChild(pLu);
lbl.appendChild(txt);
}
li.appendChild(lbl);
div.appendChild(li);
def.resolve(div);
} else {
def.resolve(false);
}
});
}, function(error) {
console.log("'doDefault ERROR: '" + error.message);
}, function() {
//console.log("'doDefault OK: '");
});
return def.promise();
}
你被范围界定所困扰。您正在 done
闭包中访问 pLu
,但该变量是外部函数的词法,而不是闭包。因此所有闭包都在寻找相同的 pLu
!如果您将代码中的 var
语句更改为 let
语句,事情应该会解决。
我正在尝试根据查询结果创建元素并将它们放入相应的 p
容器中。问题是所有元素最终都在最后一个容器中,而不是它们应该在的地方。
app.Controller.prototype.doReadOnlyDefault = function() {
var def = $.Deferred();
app.db.transaction(function(tx) {
tx.executeSql("SELECT * FROM table", [], function(tx, res) {
var len = res.rows.length;
var div = document.createElement("div");
if (len !== 0) {
var li = document.createElement("li");
var lbl = document.createElement("label");
lbl.textContent = res.rows.item(0).label;
lbl.id = 'lbl' + res.rows.item(0).id;
for (var i = 0; i < len; i++) {
var item = res.rows.item(i);
var pLu = document.createElement("ul");
var txt = document.createElement("p");
//yrdy
app.checkinController.doDependent(id).done(function(val) {
if (val) {
pLu.className = "moc-checkin-field-group moc-checkin-name-group moc-checkin-field-readonly";
pLu.appendChild(val);
}
});
txt.appendChild(pLu);
lbl.appendChild(txt);
}
li.appendChild(lbl);
div.appendChild(li);
def.resolve(div);
} else {
def.resolve(false);
}
});
}, function(error) {
console.log("'doDefault ERROR: '" + error.message);
}, function() {
//console.log("'doDefault OK: '");
});
return def.promise();
}
你被范围界定所困扰。您正在 done
闭包中访问 pLu
,但该变量是外部函数的词法,而不是闭包。因此所有闭包都在寻找相同的 pLu
!如果您将代码中的 var
语句更改为 let
语句,事情应该会解决。