2014-11-06 169 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