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] 삭제
몇 마디 만하겠습니다