Angular에서 작동하도록 비동기 DB 요청을 시도하는 중, "정의되지 않은 메서드를 호출 할 수 없습니다."

일라

AngularJS + SQLite 데이터베이스를 사용하여 PhoneGap 앱을 만들고 있습니다. 데이터베이스 쿼리에 고전적인 "비동기 작동 방식"각도 문제가 발생하여 "Undefined 메서드를 호출 할 수 없음"오류가 발생합니다. 나는 누군가가 내 방식의 오류를 볼 수 있도록 도와 줄 수 있기를 바랍니다.

다음은 내 쿼리 기능입니다. 여기에있는 모든 alert ()는 트랜잭션 자체가 성공했음을 나타내는 의미있는 데이터를 반환합니다.

    .factory('SQLService', ['$q', '$rootScope', 'phonegapReady',
        function ($q, $rootScope, phonegapReady) {

        function search(query) {
            alert("Search running with " + query);

            var promise = db.transaction(function(transaction) {

                var str = "SELECT category, id, chapter, header, snippet(guidelines, '<b>', '</b>', '...', '-1', '-24' ) AS snip FROM guidelines WHERE content MATCH '" + query + "*';";

                transaction.executeSql(str,[], function(transaction, result) {
                    var resultObj = {},
                        responses = [];
                    if (result != null && result.rows != null) {
                        for (var i = 0; i < result.rows.length; i++) {
                            resultObj = result.rows.item(i);
                            alert(resultObj.category); //gives a meaningful value from the DB
                            responses.push(resultObj);
                        }
                    } else {
                        //default content
                    }

                },defaultNullHandler,defaultErrorHandler);
                alert("End of transaction");
            });
            // Attempting to return the promise to the controller
            alert("Return promise"); //this alert happens
            return promise;

        }

         return {
            openDB : openDB,
            search: search
         };
     }]);

그리고 내 컨트롤러에서 "Cannot call method then of undefined"오류가 발생합니다.

       $scope.search = function(query) {

            SQLService.search(query).then(function(d) {
                console.log("Search THEN"); //never runs
                $scope.responses = d; //is never defined
            });

        }

수락 된 답변 덕분에 여기에 전체 작동 코드가 있습니다.

서비스

  function search(query) {
            var deferred = $q.defer();

            db.transaction(function(transaction) {

                var str = "SELECT category, id, chapter, header, snippet(guidelines, '<b>', '</b>', '...', '-1', '-24' ) AS snip FROM guidelines WHERE content MATCH '" + query + "*';";
                transaction.executeSql(str,[], function(transaction, result) {
                    var resultObj = {},
                        responses = [];
                    if (result != null && result.rows != null) {
                        for (var i = 0; i < result.rows.length; i++) {
                            resultObj = result.rows.item(i);
                            responses.push(resultObj);
                        }
                    } else {
                        resultObj.snip = "No results for " + query;
                        responses.push(resultObj)
                    }

                    deferred.resolve(responses); //at the end of processing the responses
                },defaultNullHandler,defaultErrorHandler);
            });

            // Return the promise to the controller
            return deferred.promise;

        }

제어 장치

$scope.search = function(query) {

            SQLService.search(query).then(function(d) {
                $scope.responses = d;
            });

        }

그런 다음 $ scope.responses를 사용하여 템플릿의 응답에 액세스 할 수 있습니다.

새치 모룬

여기서 질문은 무엇을 db.transaction반환 하는가 입니다.

사용하는 방식으로 볼 때 약속을 반환하지 않는 타사 코드라고 생각합니다.

올바르게 사용하고 있다고 가정하면 ( alert올바른 결과가 표시됨) 실제로 사용 $q하여 약속이 작동하도록해야합니다.

이 같은:

function search(query) {
  // Set up the $q deferred object.
  var deferred = $q.defer();

  db.transaction(function(transaction) {
    transaction.executeSql(str, [], function(transaction, result) {
      // do whatever you need to do to the result
      var results = parseDataFrom(result);

      // resolve the promise with the results
      deferred.resolve(results);
    }, nullHandler, errorHandler);
  });

  // Return the deferred's promise.
  return deferred.promise;
}

이제 컨트롤러에서 SQLService.search메서드는 DB 호출 결과로 해결되어야하는 promise를 반환합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관