【问题标题】:JavaScript Scope or AngularJS Promise $q in function函数中的 JavaScript Scope 或 AngularJS Promise $q
【发布时间】:2014-08-01 14:25:23
【问题描述】:

我对 JS 函数的范围和/或 Angularjs 承诺和 $q 有疑问。我查了一些例子,但我根本没有得到它。

在我的应用程序中,我在浏览器的 indexeddb 中保存了一些数据。在前端有一个具有自动完成功能的输入字段。输入字段的值转到我的 angularjs 控制器并调用一个函数。该函数应返回找到的值。从 indexeddb 中查找值的逻辑运行良好。

问题是我在值被推入数组之前返回了我的数组。所以我不确定是否需要更改 JavaScript 范围内的一些东西或使用 Angularjs 的东西。

这是我的控制器:

 var AutocompleteController = function($scope, $http, $q) {

 $scope.getCodeFromDB = function(val) {
        var codes = [];
            var openDbRequest = indexedDB.open('testDb', 1);

            openDbRequest.onsuccess = function (e) {
                var db = e.target.result;
                var transaction = db.transaction("codeobjekt");

                transaction.objectStore("codeobjekt")
                    .openCursor(IDBKeyRange.bound(val, val + '\uffff'))
                    .onsuccess = function (e) {
                    var cursor = e.target.result;
                    if (cursor) {
                        codes.push(cursor.value.code); //gets filled
                        console.log(cursor.value.code);
                        cursor.continue();
                    }
                };
            };

        console.log(codes); //is empty
        return codes;
    };
};

提前致谢。

【问题讨论】:

    标签: javascript angularjs indexeddb


    【解决方案1】:

    在您的代码中,您尝试使用返回后填充的数组。

    尝试使用 Angular 提供的 $q 服务。

    var AutocompleteController = function($scope, $http, $q) {
    
        $scope.getCodeFromDB = function(val) {
            var def= $q.defer(),
                codes = [],
            openDbRequest = indexedDB.open('testDb', 1);
    
            openDbRequest.onsuccess = function (e) {
            var db = e.target.result;
                var transaction = db.transaction("codeobjekt");
    
                transaction.objectStore("codeobjekt")
                    .openCursor(IDBKeyRange.bound(val, val + '\uffff'))
                    .onsuccess = function (e) {
                    var cursor = e.target.result;
                    if (cursor) {
                        codes.push(cursor.value.code); //gets filled
                        console.log(cursor.value.code);
                        cursor.continue();
                    }
                    else {
                        //cursor end
                        def.resolve(codes);
                    }
    
                };
            };
    
            return def.promise;
        };
    };
    

    及用法

    //usage
    
    $scope.getCodeFromDB("value")
    .then(function(codes) {
        //codes filled
    });
    

    【讨论】:

    • 感谢您的解决方案。这工作正常。关于usage 的一个问题:这段代码应该写在哪里?在服务?我需要代码吗?
    • 如果您需要在代码中使用 getCodeFromDB 并对加载的数据执行某些操作,您需要使用它。但是,如果您从视图中调用该函数,则没有用
    • 明白了。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    相关资源
    最近更新 更多