我正在使用node.js
和npm的sqlite
包以及discord.js
制作不和谐机器人。
我尝试从包含sqlite请求的异步函数中获取数组。
看起来我的sqlite请求也是异步的,因为我在执行请求之前得到了空响应。我如何形成我的请求以先执行它?
我已经阅读过这篇文章:How do I return the response from an asynchronous call?但我还是不明白。这不是重复的,因为链接中的问题是关于ajax
并且对我没什么帮助。我希望如果我用自己的代码看到它,我就能更好地理解它。
这就是我现在所拥有的。我已经尝试了没有结果的回调。
这是dbHandler.js
中的异步功能。
var Promise = require("bluebird");
getList: function(userID) {
return new Promise(function(resolve, reject) {
var array = [];
sql.each(`SELECT * FROM table WHERE userID = ?`, userID, (err, row) => {
if (err) {
return console.error(err);
} else {
console.log("row: " + row + " element: " + row.username);
array.push(row);
}
});
array.forEach(function(element) {
console.log("element: " + element.username);
});
console.log("array: " + array);
resolve(array);
});
}
这是我在list.js
的电话。
db.getList(uid)
.then(function(v) {
console.log("size: " + v.size);
})
.catch(function(v) {
console.log("failed: " + v);
});
在控制台中我明白了。
array:
size: undefined
row: [object Object] element: user1
row: [object Object] element: user2
row: [object Object] element: user3
dbHandler.js
getList: function(userID, callback) {
var array = [];
sql.each(`SELECT * FROM warns WHERE userID = ?`, userID, (err, row) => {
if (err) {
return console.error(err);
} else {
array.push(row);
}
});
if (array) {
callback("", array);
} else {
callback("error", "");
}
},
list.js
db.getList(uid, function (err, response) {
if (err) {
console.log(err);
} else {
console.log(response.size);
}
});
使用回调方法我只在控制台中获得undefined
。
答案 0 :(得分:0)
因为您得到以下输出:
row: [object Object] element: user1
row: [object Object] element: user2
row: [object Object] element: user3
我只能假设您从数据库中获得结果,但访问它是个问题。我建议您在决定如何访问它之前尝试转储整个对象并查看它的结构。
下面我修改了你的代码以转储对象的可读版本。从那里开始并进行调试。
getList: function(userID) {
return new Promise(function(resolve, reject) {
var array = [];
sql.each(`SELECT * FROM table WHERE userID = ?`, userID, (err, row) => {
if (err) {
return console.error(err);
} else {
console.log(JSON.stringify(row)); //lets get the contents of the row object
array.push(row); console.log(JSON.stringify(array)); //also, lets know what array contains after adding all the rows
}
});