追加到匿名函数内部的对象
Appending to object inside of anonymous function
我正试图将数据库查询的结果附加到一个表中,如下所示:
function foo() {
var result = {};
pool.getConnection(function(err, connection) {
if(err) {
console.log("Problem establishing connection with the database");
return;
}
var tables = ["first", "second", "third"];
_.forEach(tables, function(table) {
var query = "SELECT * FROM " + table;
connection.query(query, function(err, data) {
if(!err) {
result[table] = data;
} else {
console.log("Problem performing query '"%s'"", query);
}
});
});
});
return result;
}
返回的结果为空,但在forEach
内部,它正在被填充。我可以通过在循环中添加日志消息来证明这一点。
我只能认为这是一个作用域问题,但当我将结果更改为属性(this.result
)并尝试从循环中分配给它时,我得到了相同的结果。我在函数开始时添加了var that = this;
,并在循环中分配给that.result
,从而确保使用了正确的this
实例。
这不是范围问题,而是时间问题。
您试图在填充result
之前返回result
,因为匿名函数中的代码要在foo
函数返回之后才能运行。它是异步。我希望query
调用也是异步的。
由于foo
依赖于异步的东西来完成它的工作,所以它不能返回结果。它必须做getConnection
和query
所做的事情:接受一个回调函数,稍后它将调用该函数并得到结果。
这里有一种方法可以做到这一点,请参阅代码注释:
function foo(callback) { // <== Note `callback`
pool.getConnection(function(err, connection) {
if(err) {
console.log("Problem establishing connection with the database");
callback(null); // Do the callback, with a flag value for failure
return;
}
var tables = ["first", "second", "third"];
var result = {};
var results = 0; // Remember how many results we've seen
_.forEach(tables, function(table) {
var query = "SELECT * FROM " + table;
connection.query(query, function(err, data) {
if(!err) {
result[table] = data;
} else {
console.log("Problem performing query '"%s'"", query);
result[table] = null; // Flag value for failure
}
if (++results === tables.length) {
// We're done, issue the callback
callback(results);
}
});
});
});
}
因为查询函数是异步的,所以当代码第一次运行时,它会发送查询,然后返回空白对象,因为查询尚未返回。
当查询返回时,应该填写该对象的属性,但此时您需要运行一些代码才能"查看"它。如果您希望代码从该函数返回填充的对象,您会感到失望。:-)
相关文章:
- 如何使用内部对象构造对象
- 这个 getter-setter 闭包是否有充分的理由以这种方式在其内部对象中声明它是私有的
- 为什么这个内部对象文字等于另一个对象
- 内部对象如何在声明时引用其父对象的对象
- 将角度对象函数调用传播到内部对象
- Javascript 变量范围.如何从内部对象函数访问对象变量
- 更改此内部对象的行为
- "node-r包.json“-如何访问内部对象
- 在使用es2015时,我们应该如何获得对函数内部对象的引用
- 使用“;这个“;internal$.each内部对象方法
- '这'ES6中的内部对象文字
- 访问对象内部对象的属性
- 当数组是服务内部对象的属性时,如何在页面上逐个显示数组元素
- 用循环将内部对象附加到多维数组中
- 从内部对象javascript设置字段值
- 外部文件与内部对象的GeoJSON投影
- 如何在javascript对象中访问内部对象的属性
- 调用内部对象函数javascript
- Javascript函数内部对象的不同
- “this"内部对象