数组未填满

时间:2015-10-05 20:47:57

标签: javascript node.js web-sql

我有一点功能。

基本上它为在特定日期过生日的用户进行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;
},

2 个答案:

答案 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;
在调用任何回调(和推送)之前达到

。即使每个用户项不为空或为空,这也会导致结果为空数组。

这里最好的方法是定义你自己的回调,并在你的查询结果中使用完整的用户数组执行它。