2014-03-19 91 views
1

在多個$ http請求完成後觸發函數的正確方法是什麼?我有2個選項,但我不確定哪個是正確的。請注意,'完成'日誌'one'和'two'已經完成。在角度中處理多個承諾的正確方法

首先,我只是將所有的$ http請求推送到一個數組,並使用$q.all(promises).then來觸發最後的回調,我不記得我在哪裏看到這個,但它似乎工作正常(可能是因爲我的本地主機快在處理請求):

var one = $http.get("/request/one/"), 
    two = $http.get("/request/two/"), 
    promises; 

    one.then(function(response){ 
     console.log('one'); 
    }); 

    two.then(function(response){ 
     console.log('two'); 
    }); 

    promises = $q.all([one, two]); 

    promises.then(function(){ 
     console.log('done'); 
    }); 

其次,我已經看到了它在幾個教程,包括https://egghead.io/lessons/angularjs-q-all

var one = $q.defer(), 
    two = $q.defer(), 
    promises; 

    $http.get("/request/one/").then(function(response){ 
     one.resolve('one'); 
    }); 

    $http.get("/request/two/").then(function(response){ 
     two.resolve('two'); 
    }); 

    promises = $q.all([one.promise, two.promise]); 

    promises.then(function(result){ 
     console.log('done'); 
    }); 
+1

第二個被稱爲「延期反模式」。第一個是更好的。 –

回答

2

你一定要與第一種方法去。第二個創建兩個不必要的承諾。 $http已經返回承諾,所以沒有必要再創建兩個$q.defer()