2

エラーが発生し続けます - TypeError: ファクトリでメソッド (database.readOnlyStock()) を呼び出すと、undefined のメソッド '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');

        }
        }]);

そして、ここに私のコントローラーコードがあります:

        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');
          });


        }


        }]);

問題がどこにあるのかわからない。

4

2 に答える 2

2

readOnluStockメソッド内の成功ハンドラーからではなく、メソッドからプロミスを返す必要があります

    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;
    },
于 2013-11-05T03:41:54.100 に答える
0
if(cursor){
  arrayOfStocks.push(cursor.value);
  cursor.continue();
}

コントロールがこの部分に到達すると、明示的に何も返しません。これは、デフォルトundefinedで javascript によって返されることを意味します。thenだから、あなたは電話をかけようとしていますundefined。これを次のように変更したい場合があります

if(cursor){
  arrayOfStocks.push(cursor.value);
  cursor.continue();
  return deferred.promise;
}
于 2013-11-05T03:42:01.757 に答える