使用AngularJS 1.0.7中的$资源嵌套承诺 [英] Nesting promises with $resources in AngularJS 1.0.7

查看:83
本文介绍了使用AngularJS 1.0.7中的$资源嵌套承诺的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在AngularJS 1.0.7中使用参数运行函数searchBoats(boatType)。此参数是另一个函数 parseBoatType 的结果,该函数正在运行调用带有$ resource 的API的服务。如果在带有promises的资源中返回boatType,我该如何运行searchBoats?

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 which is running a service that calls an API with a $resource. How can I run searchBoats when the boatType is returned in the resource with promises?

这是我尝试过的:

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


推荐答案

您可以退回资源 $ promise 来自 parseBoatTime 函数中的 BoatType 资源并使用承诺解决 parseUrl 延迟。

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

首先从 parseBoatTime返回一个承诺 function:

First return a promise from the parseBoatTime function:

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

然后解析 parseUrl deferred ,承诺来自 BoatType 资源:

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

parseBoatType().then(deferred.resolve);

Bellow是从我提到的更正中提取的完整代码。

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

这篇关于使用AngularJS 1.0.7中的$资源嵌套承诺的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆