Angular $ q返回已解决的承诺

时间:2015-09-14 13:55:43

标签: angularjs q angular-promise

我有一个变量this.eligible,我想将其赋值给返回的promise而不是实际的promise对象。

userService

this.eligible = this.sweepstakesService.checkUser(data);

sweepstakesService

checkUser({profileId}) {
var deferred = this.$q.defer();
var id = profileId.replace(/[{}]/g, "");

this.$q.when(this.getGuid(id)
  .then(guid => this.determineEligibility(guid))
  .catch(this.handleError))
  .then(function(data){
      deferred.resolve(data);
});

  return deferred.promise;

}

 getGuid(profileId){
    return this.resourcesService.guid.save({id:profileId}).$promise.then(data => data.guid);
  }

 determineEligibility(response){
      return this.resourcesService.eligibility.save({id:response}).$promise.then(data => data.isEligible);
    }


 handleError(response){
      console.log(response);
  }

目前我正在返回Promise{$$state: Object}而不是实际已解决的值。

2 个答案:

答案 0 :(得分:3)

为了访问promise的结果,您需要在promise对象上提供对then方法的回调,一旦结果可用,就会异步调用它。

this.sweepstakesService.checkUser(data)
.then(function(value){
    this.eligible = value;
});

答案 1 :(得分:0)

当您使用承诺时,您正在执行某些异步请求,因此您必须传递一些回调功能才能检索您的数据,等待它。

您可以使用延迟API中的 $ q.defer()承诺管理器。

$ q.defer()获取2种方法:

  • resolve(value):通过向她提供最终价值来解决我们的相关承诺

  • reject(reason):解决了承诺错误。

不要忘记你正在做一些异步工作 ......

此外,一个好的提示可以是将当前上下文保存到变量中,以便绑定您的数据。

<强>控制器

(function(){

function Controller($scope, Service) {

  //Save the current context of our controller
  var self = this;

  self.success = '';

  self.fail = '';

  //Declare our promise
  var promise1 = Service.get(2);

  var promise2 = Service.get(6);

  promise1.then(function(response){
    //Retrieve our response and set it to our success variable
    //We use self as our Controller context
    self.success = response;
  }).catch(function(error){
    self.success = error;
  });

  promise2.then(function(response){
    self.fail = response;
  }).catch(function(error){
    //Retrieve our error and set it to our fail variable
    self.fail = error;
  });


}

angular
.module('app', [])
.controller('ctrl', Controller);

})();

<强>服务

(function(){

  function Service($http, $q) {

    function get(n){
      //using $q.defer() from deferred API
      var defer = $q.defer();

      //Simulate latency
      setTimeout(function(){
        n < 3
        ? defer.resolve(n)
        : defer.reject('Error');
      }, 1500);

      //Return our promise
      return defer.promise;

    }

    return {
      get: get
    }

  }

  angular
    .module('app')
    .factory('Service', Service);

})();

然后,您可以使用 controllerAs 语法来实例化您的控制器。

<强> HTML

  <body ng-app='app' ng-controller='ctrl as self'>

    <div>Success : {{self.success}}</div>
    <div>Fail : {{self.fail}}</div>

  </body>

您可以在此Working Plunker

上查看示例