2015-10-05 65 views
0

我有一个小功能。阵列没有填充

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

这是一个异步任务吗?在交易发生之前''用户'将被退回 – baao

回答

2

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

函数在数据库执行完成前退出并返回用户,所以用户仍然是一个空数组。


编辑

正如有人指出的那样,你也可以使用一个承诺。

示例使用回调:

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

我不是网络SQL方面的专家,但似乎你正在执行的回调函数是异步的。这意味着行

return users; 

之前达成任何回调(和推)被调用。这会导致结果是一个空数组,即使每个用户项不为空或为空。

这里最好的方法是定义自己的回调函数,并将其作为查询结果与完整用户数组一起执行。