2017-05-16 79 views
0

這是一個壞方法來做到這一點?我基本上是鏈接承諾,其中每個從服務器成功返回,啓動一個新的http.get()的更多信息,但不是當它出錯。沒有更多的http.get(),如果它導致errorCallback!鏈接http.get承諾與角度服務

$http.get(...).then(function() { 
    $http.get(...).then(function(){ 
     $http.get(...).then(function(){}, function(){}), 
    function(){}); }, 
mainErrorCallback); 

難道有所作爲,如果它是不是 「$ http.get()」 它 「ViewsService.loadViews()」 的

$http.get(...).then(function() { ViewsService.loadViews(); }, function(){ console.log("error"); }). 

編輯裏面:這就是我的意思,同步..好像它的工作原理,但代碼需要清理/效率顯得有點整潔:

http://jsfiddle.net/4n9fao9q/6/

(與德拉yed http請求):http://jsfiddle.net/4n9fao9q/26

+0

是否有任何依賴之間的結果諾言和呼籲諾言是在當時的塊內? – Kalyan

+0

是的,所以整個問題就是鏈接...一個成功,然後DO下一個http.get ...第二個成功只有然後,做第三個。是的,它應該等待來自服務器的響應。但我的jsfiddle示例顯示它等待... http://jsfiddle.net/4n9fao9q/2/ – Dexter

+0

用戶$ q服務。它允許: $ q.all([承諾數組])然後() – XGreen

回答

2
$http.get(...).then((res) => { 
    //res has data from first http 
    return $http.get(...); 
}).then((res) => { 
    //res has data from second http 
    return $http.get(...); 
}).then((res) => { 
    //res has data from third http 
}).catch((err) => { 
    //exploded 
}); 

我認爲更乾淨。你可以用任何函數返回承諾來替換$ http.get。如果ViewsService.loadViews()返回一個承諾,您可以使用它。

正如評論中所述。

... 
ViewsService.loadViews = function() { 
    //returns a promise 
    return $http.get(...); 
} 

OR 

ViewsService.loadViews = function() { 
    return new Promise((resolve, reject) => { 
    $http.get(...).then((result) => { 
     //whatever 
     return resolve(); 
    }) 
    }) 
    return $http.get(...); 
} 

與任何此選項loadViews你可以做ViewsService.loadViers.then(ETC)

+0

但是,如果ViewsService.loadViews有它自己的http.get ...但沒有承諾呢。這是否打破了生命週期?這是否意味着內部調用「loadviews」中的http.get .success(){}與http.get首次啓動時是異步的? – Dexter

+0

是的,我認爲你的代碼是正確的。 http://jsfiddle.net/4n9fao9q/10/它似乎確實鏈接它。 – Dexter

+0

最後一個問題,我想確保如果第一個請求花費太長時間,它不會觸發「.then」中的後續調用,這就是爲什麼您要「返回」$ http。取而代之的只是「調用$ http.get」? – Dexter

1

這是一個糟糕的方式做到這一點?

  • 效率

除非使用從作爲輸入到以下請求中的第一請求的響應,那麼這是不 一種非常有效的方法來做到這一點,因爲每個請求將被阻塞直到前一個已經返回。一個更好的辦法 是使用$.all($http.get(...),$http.get(...))

  • 風格

嵌套調用(the pyramid of doom)難以閱讀。由於每個呼叫都具有相同的故障響應,您可以將這些呼叫鏈接起來。例如

`$http.get(..).then 
($http.get(..)).then(
($http.get(..)).catch(errHander)` 
+0

有趣...不,我不想異步。我想要同步(我不希望所有的一次射擊,我希望用戶等待,因爲我希望所有東西都按順序裝入)。做#1,等待迴應,只有#1成功,然後發起#3請求,然後等待#3請求,如果成功,則只做#4。 – Dexter