数组未填充

Array does not get filled

我有点小功能

基本上是通过 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;
},

您的数据库执行是一项异步任务。当 SQL 执行完成时,您需要使用回调,返回用户数组。然后它会被填充。

数据库执行完成前函数退出,returns个users,所以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);
});

我不是网络专家SQL,但是你执行的回调函数好像是异步的。这意味着行

return users;

在调用任何回调(和推送)之前达到。这会导致结果为空数组,即使每个用户项都不为空或为空也是如此。

此处最好的方法是定义您自己的回调并使用完整的用户数组执行它作为您的查询结果。