AngularJS promise doesn't retrieve a deeply wrapped jquery $.post call -


i developing both javascript library , angularjs front-end. javascript library needs portable cannot rely on angularjs. use pretty standard servlet query pattern:

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

this queryservice function called other functions in our library. can see that queryservice returns nothing. expects callback function perform needed actions. can't figure out callback function needed return result promise object's then() function. here's angular service code:

angular.module("app").service("data", function($q){ return {   getcolnamesfromdb: function(table, scope){     var deferred = $q.defer();      var callbackfcn = function(result){       console.log(result); // logs result console!       deferred.resolve(result); // 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));       // tried $q.when(querywrapperforcolnames(scope.tablename, callbackfcn));      });      return deferred.promise;   }}; }); 

from controller call data.getcolnamesfromdb() , promise object. no matter try can't then() function see returned db. here controller:

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

i know i'm missing stupid how promises work can't see what. should clear of "options" i've commented in code i'm @ point i'm trying random methods , crossing fingers.

the first thing try fixing call:

var promise = data.getcolnamesfromdb("table1", $scope); 

according example, method defined taking $scope first parameter, not second, safeapply function never cause $digest cycle occur since string doesn't have $$phase property.

edit

now example has been corrected, try this:

angular.module( "app" ).service( "data", function( $q ) {     return {         getcolnamesfromdb: function( table, scope ) {             var deferred = $q.defer();              function safeapply( fn ) {                 if ( !scope.$$phase ) {                     scope.$apply( fn );                 }                 else {                     fn();                 }             }              querywrapperforcolnames( scope.tablename, function( result ) {                 safeapply(function() {                     console.log( result );                     deferred.resolve( result );                 });             });              return deferred.promise;         }     }; }); 

in original example, you're resolving deferred twice; once in safeapply call, , once in callback function. deferreds can resolve once ( further calls have no effect ), deferred have been resolved value passed in safeapply. since querywrapperfor implicitly returns undefined ( don't see definition here ), deferred have been resolved undefined.


Comments

Popular posts from this blog

javascript - DIV "hiding" when changing dropdown value -

Does Firefox offer AppleScript support to get URL of windows? -

android - How to install packaged app on Firefox for mobile? -