我有一个node.js应用程序,我正在为数据库使用sequelize和mysql。
我一直在查看sequelize和bluebird文档,试图找到一种方法将sequelize查询推送到一个数组。 我有一个循环的订单数组,然后对地址模型进行查询。
我的查询如下:
var objArr = [];
models.address.findById(6).then(function(address){
objArr.push(address);
});
console.log(objArr);
如果我在查询中移动console.log它可以工作,但是objArr外面是空的。我想弄清楚为什么会这样。是不是可以这样做?我在这里找不到答案或上面提到的文档。如果有人能指出我正确的方向,我愿意阅读更多文档
答案 0 :(得分:0)
您的代码是异步的,这意味着您的console.log在推送之前执行:
var objArr = [];
models.address.findById(6).then(function(address){
objArr.push(address);
});
console.log(objArr); // This code is executed before the objArr.push(address);
答案 1 :(得分:0)
这是因为回调是异步的...顺序如下:
var objArr = [];
models.address.findById(6); //makes query, starts waiting for a response
// array is empty at this point
console.log(objArr);
//at a later time got answer, invoking callback
.then(function(address){
})
这是伪代码,只是为了说明这一点。此代码无效
你可能会尝试这样做:
function () {
var objArr = [];
models.address.findById(6).then(function(address){
objArr.push(address);
});
console.log(objArr);
return objArr
}
相反,您应该将所有这些作为异步代码处理。回调示例:
function (callback) {
models.address.findById(6).then(function(address){
callback(address);
});
}
或者你应该查看Promises。那就是"。然后"
来自答案 2 :(得分:0)
您可以执行以下操作:
var objArr = [];
models.address.findById(6).then(function(address){
objArr.push(address);
return objArr;
})
.then(console.log);