Javascript闭包–将对象返回到调用函数

Javascript闭包–将对象返回到调用函数,javascript,scope,closures,angularjs,Javascript,Scope,Closures,Angularjs,我正在使用Cordova和Angular作为一个小型Web应用程序。以下是实施过程: LogsModel已创建 queryLogs被称为 调用getLogsArray–此时,即使在函数定义中,console.logthis.logs['0']也返回未定义。我不明白为什么。 queryLogs是一个异步任务。启动事务后直接调用getLogsArray,数组将不会被填充 相反,请使用从querySuccess函数调用的回调函数继续处理日志记录结果。为什么要使用整型键写入数组,而使用字符串键读取?这个

我正在使用Cordova和Angular作为一个小型Web应用程序。以下是实施过程:

LogsModel已创建 queryLogs被称为 调用getLogsArray–此时,即使在函数定义中,console.logthis.logs['0']也返回未定义。我不明白为什么。 queryLogs是一个异步任务。启动事务后直接调用getLogsArray,数组将不会被填充


相反,请使用从querySuccess函数调用的回调函数继续处理日志记录结果。

为什么要使用整型键写入数组,而使用字符串键读取?这个.logs['0']和这个.logs[0]是我排除故障的剩余部分。@johusman:这没什么区别。在JS中,所有属性都转换为字符串。是的,但这很容易混淆,询问可能会揭示一个更大的问题:解决方案:在调用queryLogs的控制器范围内传递一个回调函数,该函数接受一个数据参数。我调用回调,它将数据返回给我的控制器,一切都很好。在一个非常全面的、反复试验的过程中,我使用了Bergi的建议。好的,它有助于识别任务的类型——现在我知道了该方法返回空的原因。在这一点上,我仍然不明白如何在querySuccess中有一个回调,可以将结果返回到最初调用queryLogs的位置。思想?不,永远不会。您需要使用。如果您想从函数中返回有用的内容,请查看延迟对象
LogsModel.prototype.logs = {};

LogsModel.prototype.getLogsArray = function (){
    console.log(this.logs['0']);
    return this.logs;
};

LogsModel.prototype.queryLogs = function (){

    var self = this;

    function getFromDb (tx){
        tx.executeSql('SELECT * FROM DEMO',[],querySuccess,self.query_fail);
    }

    function querySuccess(tx,results){
        var len = results.rows.length;

        for(var i = 0; i < len; i++){

            var log = {
                verb: results.rows.item(i).verb
            };
            self.logs[i]= {
                verb: results.rows.item(i).verb
            };
        }
    }
    this.db = window.openDatabase("Database","1.0","Cordova Demo",200000);
    this.db.transaction(getFromDb,self.transaction_fail);
};