2014-11-06 135 views
-1

的顺序我有两个承诺:angularJS:承诺

为gettoken()//:从服务器

getUseraData得到CSFR饼干()// :获取用户数据,但它需要从getToknen()获取cookie,否则服务器会响应一个错误。

所以,我知道我可以在我的控制器做到这一点:

getToken().then(function (result) { 
    getUserData(result); 
}); 

但我知道,这是不是那么好经营的承诺中的承诺。

所以:我怎么才能执行getUserData()承诺只有在getToken是terminard和值返回?

+1

*“但我知道在承诺中履行承诺并不是那么好”*〜得到了一个参考? – Phil 2014-11-06 00:38:18

+1

如果你不想嵌套匿名函数,你可以使用getToken()。然后(getUserData);我不太确定你在问什么。 – rtucker88 2014-11-06 00:40:47

+0

为什么不使用'promise.then()。then()' – deadlock 2014-11-06 00:50:47

回答

2

没有什么错链的承诺,这是你在做什么,只要你别忘了返回一个承诺,所以像这样做:

var getUserDataPromise = getToken().then(function (result) { 
    return getUserData(result); 
}); 

或者这样:

getToken().then(function (result) { 
    return getUserData(result); 
}).then(function(getUserDataPromiseResult){ 
    //here you will have the getUserData promise resolved 
}); 

请注意,对于此工作,您需要return一个承诺。我坚持认为:这不是一个不好的做法,这是一个very common practice

0

你可以使用延迟功能..你需要注入$ Q ..

创建一个服务,然后添加你为gettoken http请求的代码。像这样

myapp.factory('myService',$q,$http){ 
    var deferred = $q.defer(); 
     var newVal = { 'Value': val }; 

    var getToken = functino(){ $http({ 
      method: 'PATCH', 
      url: baseService.getBaseService + 'ModuleAndParameters(' + ModAndParamsId + ')', 
      data: newVal 
     }).success(function (data, status, headers, config) { 
      deferred.resolve(data) 
     }).error(function (data, status, headers, config) { 
      deferred.reject(status); 
     }); 

     return deferred.promise; 
    }; 

return getToken; 
} 

然后在你的控制器,,注入的名字你的服务..而只是单纯的做这样的..

myService.getToken().then(function(result){ 
getUserData(result); 
}) 

我希望它有帮助.. xD