2015-09-14 126 views
1

我有一個變量this.eligible,我想分配給返回的承諾,而不是實際的承諾對象的值。

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},而不是實際的解析值。

+0

爲例目前尚不清楚你的要求。 ''我有一個變量''_What_變量? – sdgluck

+0

我修改了我的問題 – byrdr

回答

2

爲了訪問promise的結果,需要在promise對象上提供一個then方法的回調函數,只要結果可用,它就會被異步調用。

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

謝謝!我結束了一個稍微詳細的變量定義this.eligible = this.sweepstakesService。checkUser(data).then((function(data){this.eligible = data})。bind(this)); – byrdr

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