在进入查询之前,问题对象已定义,在问题查询内部它是未定义的。我尝试了同类型帖子中提到的解决方案,但没有成功。代码中的注释进一步解释了该问题。
var createIssues = function createIssues(rows, wrap) {
var issues = [];
for (var i = 0; i < rows.length; i++) {
// Processing code redacted
issues.push({
id : rows[i].id,
// Other field redacted
});
// ISSUES OBJECT CORRECT HERE
console.log(JSON.stringify(issues[i]))
// Query comments for individual post
connection.query(
"SELECT C.id, C.elementID, C.googleID, C.time, C.body FROM comments C WHERE elementID = ? AND approved = 1", issues[i].id,
function (err, rows_comments) {
// ISSUES OBJECT UNDEFINED HERE
console.log(JSON.stringify(issues[i]))
// More code redacted
}
)
}
return issues;
}
我尝试将它作为函数传递,类似于我在网上的解释中找到的方式,但现在它说“TypeError:未定义不是函数”
var createIssues = function createIssues(rows, wrap) {
var issues = []; // Create issues array
// Loop throug every issue that was
// returned by the SQL query.
for (var i = 0; i < rows.length; i++) {
// Redacted processing code
issues.push({
id : rows[i].id,
// Redacted extra fields
});
(function(issues) {
connection.query(
"SELECT C.id, C.elementID, C.googleID, C.time, C.body FROM comments C WHERE elementID = ? AND approved = 1", issues[i].id,
function (err, rows_comments) {
// Can't access issues here, undefined
}
)
})(issues);
}
return issues;
}
最佳答案
这里的问题是您将整个问题数组传递到您的 iife 中,而不是仅将单个问题数组传递到您的 iife 中,从而使 iife 毫无意义,因为它没有解决它应该解决的问题。
(function(issue) {
connection.query(
"SELECT C.id, C.elementID, C.googleID, C.time, C.body FROM comments C WHERE elementID = ? AND approved = 1", issue.id,
function (err, rows_comments) {
// worky
}
)
})(issues[i]);
也就是说,您可以通过使用适用于所有数组的 forEach 方法来完全避免此问题。如果您有一个数组,并且需要以步长 1 对其进行循环,则没有理由不使用数组方法而不是 for 循环。
var createIssues = function createIssues(rows, wrap) {
var issues = []; // Create issues array
// Loop throug every issue that was
// returned by the SQL query.
rows.forEach(function (row, index) {
// Redacted processing code
var issue = {
id : row.id,
// Redacted extra fields
}
issues.push(issue);
connection.query(
"SELECT C.id, C.elementID, C.googleID, C.time, C.body FROM comments C WHERE elementID = ? AND approved = 1", issue.id,
function (err, rows_comments) {
// worky
}
)
});
return issues;
}
但请注意,issues
将在所有异步工作完成之前返回到调用范围,这意味着您在 //worky
处执行的任何操作> 评论要过一段时间才会生效。
关于javascript - 如何在Javascript中异步使用对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32593440/