stackoverflow.com/questions/46348382/...

ужно запустить функцию"SearchBoats (boatType)" в AngularJS 1.0.7 с параметром. Этот параметр является результатом другой функцииparseBoatType который запускает службу, которая вызывает API с $ ресурсом, Как я могу запустить searchBoats, когда boatType возвращается в ресурс с обещаниями?

Вот что я попробовал:

    var parseURL = function() {                                                         
            var deferred = $q.defer();
            var promise = deferred.promise;
            promise.then(function success (result) {                    
                console.log(result);
                searchBoats(result);
            });

            deferred.resolve(
                parseBoatType()
            );                                                                                                                                                                                                                          
        };      
        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
        BoatType.getBoatTypeByName({name: boatTypeParsed}, function success(result) {
                return result;
            });

        // 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
.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;           
  }
  )
 zero29821 сент. 2017 г., 17:02
Я бы сослался на ваш предыдущий вопрос:Как запускать функции с зависимостями чтобы другие могли получить дополнительный контекст вашей проблемы. Я рад, что вы смогли выяснить вашу проблему.

Ответы на вопрос(1)

Решение Вопроса

$promise изBoatType ресурс вparseBoatTime функционировать и использовать обещание, чтобы решитьparseUrl отложить.

Сначала верните обещание отparseBoatTime функция:

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

Затем разрешитеparseUrl deferred с обещанием отBoatType ресурс:

parseBoatType().then(deferred.resolve);

Ниже приведен полный код вашего вопроса с упомянутой поправкой.

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 [email protected]^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;
  }
)

 Rober21 сент. 2017 г., 16:50
Обновлено! ;) Ты мой герой!
 Rober21 сент. 2017 г., 08:15
Я думаю, что я скопировал / вставил ваш код, но я получаю эту ошибку: TypeError: Невозможно прочитать свойство 'then' из undefined в этой строке parseBoatType (). Then (deferred.resolve); На всякий случай важно использовать Angular 1.0.7.
 lenilsondc21 сент. 2017 г., 13:21
@ Робер, это действительно так$promise собственность была введена на[email protected] в этом случае вам придется использовать обещания, как в первой функции. Я обновлю свой ответ. Можете ли вы намекнуть на эту версию в своем вопросе?
 Rober21 сент. 2017 г., 17:04
Ваш ответ работает! Но, просто чтобы положить глазурь на пирог, как бы это было, если бы вместо одной функции parseBoatType были две разные функции, которые могли бы работать параллельно (второй parseDestination), но обе должны быть запущены перед выполнением searchBoats? Я думаю, что они могут быть вложенными, но возможно ли сделать это параллельно, может быть, с $ q.all?
 Rober21 сент. 2017 г., 17:56
Я создам новый пост, расширяющий этот с этой темой здесь:stackoverflow.com/questions/46348382/...

Ваш ответ на вопрос