我有一点功能。
基本上它为在特定日期过生日的用户进行WebSQL搜索。
我的问题是它用console.log(user)
记录用户并且我可以看到输出,但是不知怎的,尽管我将用户推送到users.push(user)
,但用户数组仍为空
对我而言,似乎代码中无法访问数组users
(但我没有收到任何错误)
我错了什么?谢谢!
compare_dates_with_users: function(dates){
var users = [];
var dates_string = this.prepare_dates_for_query(dates);
this.get_database().transaction(function(t) {
t.executeSql("SELECT * FROM user WHERE birthday IN (" + dates_string.join(', ') + "); ", [], function(tx, results){
var len = results.rows.length, i;
for (i = 0; i < len; i++) {
var user = results.rows.item(i);
user.f_date = true;
console.log(user);
users.push(user);
}
});
});
return users;
},
答案 0 :(得分:2)
您的数据库执行是异步任务。您需要在SQL执行完成时使用回调,并返回users数组。然后它就会被填满。
该函数在数据库执行完成之前退出并返回用户,因此用户仍然是一个空数组。
修改
如有人指出,您也可以使用承诺。
使用回调的示例:
compare_dates_with_users: function(dates, callback){
var users = [];
var dates_string = this.prepare_dates_for_query(dates);
this.get_database().transaction(function(t) {
t.executeSql("SELECT * FROM user WHERE birthday IN (" + dates_string.join(', ') + "); ", [], function(tx, results){
var len = results.rows.length, i;
for (i = 0; i < len; i++) {
var user = results.rows.item(i);
user.f_date = true;
console.log(user);
users.push(user);
}
callback(users);
});
});
},
调用该函数:
compare_dates_with_users(dates, function(users){
//Users is now populated
console.log(users);
});
答案 1 :(得分:1)
我不是Web SQL的专家,但似乎正在执行异步的回调函数。这意味着该行
return users;
在调用任何回调(和推送)之前达到。即使每个用户项不为空或为空,这也会导致结果为空数组。
这里最好的方法是定义你自己的回调,并在你的查询结果中使用完整的用户数组执行它。