Nesting promises with $resources in AngularJS 1.0.7

前端 未结 1 1090
渐次进展
渐次进展 2020-12-22 07:46

I need to run a function \"searchBoats(boatType)\" in AngularJS 1.0.7 with a parameter. This parameter is the result of another function parseBoatType

相关标签:
1条回答
  • 2020-12-22 08:28

    You can return the resource $promise from the BoatType resource in the parseBoatTime function and use the promise to resolve the parseUrl deferred.

    First return a promise from the parseBoatTime function:

    return BoatType.getBoatTypeByName({
        name: boatTypeParsed
      }, function success(result) {
        return result;
      }).$promise;
    

    Then resolve the parseUrl deferred with the promise from the BoatType resource:

    parseBoatType().then(deferred.resolve);
    

    Bellow is the full code taken from your question with the correction I mentioned.

    var parseURL = function() {
      var deferred = $q.defer();
      var promise = deferred.promise;
      promise.then(function success(result) {
        console.log(result);
        searchBoats(result);
      });
    
      parseBoatType().then(deferred.resolve);
    };
    parseURL();
    
    var parseBoatType = function() {
    
      //  Do some stuff        
      // Calculate boatType calling a service that uses resource to call 
      // an API
      // I can convert this callback into a promise but still facing same 
      // issue
    
      // Code for ngResource@^1.2.0
      /*return BoatType.getBoatTypeByName({
        name: boatTypeParsed
      }, function success(result) {
        return result;
      }).$promise;*/
    
      // Code for ngResource lower than 1.2.0
      var deferred = $q.defer(), promise = deferred.promise;
    
      BoatType.getBoatTypeByName({
        name: boatTypeParsed
      }, deferred.resolve, deferred.reject);
    
      return promise;
    
      // The service method is called and the code is still running until 
      // the end of the function without waiting for the service result.
      // Then the promise.then code in the parseURL is executed and 
      // searchBoats is run with boatType undefined.                                  
    };
    
    // The service with the $resource call to the API
    app.factory('BoatType',
      function($resource, SERVER_URL) {
        var boatTypes =
          $resource('http://' + SERVER_URL + '/:action', {
            action: 'boat_types'
          }, {
            query: {
              method: 'GET',
              isArray: true
            },
            getBoatTypeByName: {
              method: 'GET',
              params: {
                action: 'getBoatTypeByName'
              },
              isArray: false
            }
          });
        return boatTypes;
      }
    )

    0 讨论(0)
提交回复
热议问题