javascript - 获取类型错误 : Cannot call method 'then' of undefined in angularjs controller

标签 javascript angularjs

当我在工厂中调用方法(database.readOnlyStock())时,我不断收到错误 - TypeError:无法调用未定义的方法“then”。另外,我发现有点尴尬的是,该函数确实相应地运行,因为我看到了 console.log 消息。

这是工厂代码:

        stocks.factory('database', ['$resource', '$http', '$q', function($resource, $http, $q) {
            var dataMethods = {
                createConnection: function() {
                    /*moved to onload below */
            },
                addStock: function(stock, nameofcompany) {

                var _this = this;
                console.log("About to add stock");

                //Get a transaction
                //default for OS list is all, default for type is read
                var transaction = this.db.transaction(["portfolio"],"readwrite");
                //Ask for the objectStore
                var store = transaction.objectStore("portfolio");

                //Define a person
                var stockTemplate = {
                        company_name: nameofcompany,
                        name:stock,
                        created:new Date()
                }

                //Perform the add
                var request = store.add(stockTemplate);

                request.onerror = function(e) {
                        console.log("failed to add stock to portflio",e.target.error.name);
                        //some type of error handler
                }

                request.onsuccess = function(e) {
                        console.log("successfully added stock to portfolio");
                        //console.log(store);
                        //_this.readOnlyStock();

                }


                },
                readOnlyStock: function() {
                   var deferred = $q.defer(); 
                var transaction = this.db.transaction(["portfolio"],"readonly");
                var store = transaction.objectStore("portfolio");

                 // var cursorRequest = store.openCursor();

                 var arrayOfStocks = [];




                   var keyRange = IDBKeyRange.lowerBound(0);
                    var cursorRequest = store.openCursor(keyRange);
                  cursorRequest.onsuccess = function(e) {

                    var cursor = e.target.result;
                    if(cursor){

                        arrayOfStocks.push(cursor.value);
                        cursor.continue();
                  }
                  else{


                    console.log(arrayOfStocks);
                    console.log('done!');

                    deferred.resolve(arrayOfStocks);
                    return deferred.promise;


                    //return arrayOfStocks;
                }
                  }
                cursorRequest.onerror = function(){

                    console.log('could not fetch data');
                }


                },




                deleteStock: function() {}
        }
        //return dataMethods;
        if (window.indexedDB) {
            console.log('indexeddb is supported');
            var openRequest = indexedDB.open("users_stocks", 4);
                    openRequest.onupgradeneeded = function(e) {
                        var thisDB = e.target.result;
                        if (!thisDB.objectStoreNames.contains("portfolio")) {
                            console.log('created object store');
                            thisDB.createObjectStore("portfolio", {
                                autoIncrement: true
                            });
                        }
                    }
                    openRequest.onsuccess = function(e) {
                        console.log('connection opened'); 
                        dataMethods.db = e.target.result     
                    }
                    openRequest.onerror = function(e) {
                        console.log('could not open connection');
                    }
            return dataMethods;
        } 
        else {
            console.log('indexedDB not supported');

        }
        }]);

然后这是我的 Controller 代码:

        stocks.controller('portfolio', ['$scope', '$http', 'stockData', 'database', function portfolio($scope, $http, stockData, database) {


          $scope.getAllStocks = function(){
            console.log('running getll stocks');

        database.readOnlyStock().then(function(result) {
            console.log('done');

            $scope.allstuff = result;
          }, function(){

            console.log('no');
          });


        }


        }]);

不确定问题出在哪里。

最佳答案

您需要从 readOnluStock 方法返回 promise ,而不是从其中的成功处理程序返回

    readOnlyStock: function () {
        var deferred = $q.defer();
        var transaction = this.db.transaction(["portfolio"], "readonly");
        var store = transaction.objectStore("portfolio");

        // var cursorRequest = store.openCursor();

        var arrayOfStocks = [];




        var keyRange = IDBKeyRange.lowerBound(0);
        var cursorRequest = store.openCursor(keyRange);
        cursorRequest.onsuccess = function (e) {

            var cursor = e.target.result;
            if (cursor) {

                arrayOfStocks.push(cursor.value);
                cursor.
                continue ();
            } else {


                console.log(arrayOfStocks);
                console.log('done!');

                deferred.resolve(arrayOfStocks);
                //return arrayOfStocks;
            }
        }
        cursorRequest.onerror = function () {

            console.log('could not fetch data');
        }

        // the return should be here
        return deferred.promise;
    },

关于javascript - 获取类型错误 : Cannot call method 'then' of undefined in angularjs controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19781505/

相关文章:

javascript - 在客户端将html表格导出到ppt?

javascript - 如果不发送数据,Ajax 请求将无法工作

javascript - 图 : Div hover then Displays Image

angularjs - 数字列的排序无法正常工作 - Angular-ui-grid

jquery - 如何使用自定义元素单击事件更新范围值?

javascript - 如何使用 angular-ui-bootstrap 根据屏幕分辨率在垂直药丸和选项卡之间正确交换?

javascript - 使用 Angular js 嵌入 Html 页面

javascript - 用于检索数据的 Firebase 用户 ID 变量

javascript - 组合 jQuery 对象

javascript - 这个 HTTP-Get Basic 身份验证代码有什么问题?