JavaScript ライブラリと AngularJS フロントエンドの両方を開発しています。JavaScript ライブラリは移植可能である必要があるため、AngularJS に依存することはできません。非常に標準的なサーブレット クエリ パターンを使用します。
queryService = function(url, method, params, resultHandler, queryId)
{
var request = {
jsonrpc: "2.0",
id: queryId || "no_id",
method: method,
params: params
};
$.post(url, JSON.stringify(request), handleResponse, "json");
function handleResponse(response)
{
if (response.error)
console.log(JSON.stringify(response, null, 3));
else if (resultHandler)
resultHandler(response.result, queryId);
}
};
このqueryService
関数は、ライブラリ内の他の関数によって呼び出されます。queryService
何も返さないことがわかります。コールバック関数が必要なすべてのアクションを実行することを期待しています。結果を promise オブジェクトの関数に返すために必要なコールバック関数がわかりませんthen()
。Angular サービス コードは次のとおりです。
angular.module("app").service("Data", function($q){
return {
getColNamesFromDb: function(table, scope){
var deferred = $q.defer();
var callbackFcn = function(result){
console.log(result); // This successfully logs the result to the console!
deferred.resolve(result); // also tried deferred.resolve();
};
var safeApply = function(scope, fn) {
(scope.$$phase || scope.$root.$$phase) ? fn() : scope.$apply(fn);
};
safeApply(scope, function(){
deferred.resolve(queryWrapperForColNames(scope.tableName, callbackfcn));
// also tried $q.when(queryWrapperForColNames(scope.tableName, callbackfcn));
});
return deferred.promise;
}};
});
コントローラーから呼び出しData.getColNamesFromDb()
て、promise オブジェクトを取得します。しかし、何をしようとしてもthen()
、DB から返されたものを関数に表示させることはできません。コントローラーは次のとおりです。
angular.module("app").controller("Ctrl", function($scope, Data)
{
$scope.options;
var promise = Data.getColNamesFromDb("table1", $scope);
promise.then(function(result){
$scope.options = result;
},function(result){
console.log("error " + result);
});
})
私は約束がどのように機能するかについて愚かなことを見逃していることを知っていますが、何がわかりません。コードでコメントした「オプション」のいくつかから、ランダムな方法を試して指を交差させているだけであることは明らかです。