2016-06-09 96 views
0

我在我的控制器中使用兩個工廠調用。在這兩個捕獲中,我想調用單獨的函數來處理這些錯誤。

我有:

someFactory.functionOne().then(function (data) { 
    $scope.one = data; 
}).catch(functionToHandleOne()); 

someFactory.functionTwo().then(function (data) { 
    $scope.two = data; 
}).catch(functionToHandleTwo()); 

是在沒有更好的方法,我可以用$ q.all()之類

$q.all({ 
    one: someFactory.functionOne(), 
    two: someFactory.functionTwo() 
}).then (function (data) { 
    $scope.one = data.one; 
    $scope.two = data.two; 
}).catch(
    //here I have to call functions functionToHandleOne() and functionToHandleTwo() according to error caused which function call 
); 
+1

捕捉將被儘快該函數的一個拒絕執行。所以如果你需要爲這個函數處理錯誤,不管用什麼函數,你都不能使用$ q.all,否則只需要使用一個匿名函數並確定錯誤變量屬於哪個函數並調用相應的函數。 – John

回答

0

VAR應用= angular.module( 'plunker' 爲此, []);

app.factory('json',function($q,$http){ 

    return function(files){ 

    var promises = files.map(function(file){ 

     var deffered = $q.defer(); 

     $http({ 
     url : file, 
     method: 'GET' 
     }). 
     success(function(data){ 
     deffered.resolve(data); 
     }). 
     error(function(error){ 
      deffered.reject(); 
     }); 

     return deffered.promise; 

    }) 

    return $q.all(promises); 
    } 

}); 

app.controller('MainCtrl', function($scope,json) { 
    $scope.name = 'World'; 

    json(['a.json','b.json']).then(function(datas){ 
    $scope.a = datas[0] 
    $scope.b = datas[1] 
    }) 

}); 

有上面的完整代碼,你可以找到你需要的一切。像

$ q在工廠中傳遞,如果您有多個功能,那麼您可以調用所有工廠到單個工廠,並使它們真正成爲您的需要。

您可以在控制器中看到,如下面的代碼所示,它將返回數據。

json(['a.json','b.json']).then(function(datas){ 
    $scope.a = datas[0] 
    $scope.b = datas[1] 
    }) 

「datas」返回所有調用的多個值,因此您需要使用數組。

請讓我知道如果解決或需要更多的研究

khajaamin

+1

僅供參考,'$ http.success'和'$ http.error'已棄用,不應使用。您應該使用'.then'和'.catch'來代替。 – ste2425

+0

謝謝先生,我會記得 – khajaamin

0

你的解決方案是完全正常的。你錯過了'catch'中的錯誤回調函數,當然還有錯誤參數。

一個例子:

$q.all({ 
    one: someFactory.functionOne(), 
    two: someFactory.functionTwo() 
}).then (function (data) { 
    $scope.one = data.one; 
    $scope.two = data.two; 
}).catch(function(e){ 
if(e.argument == 'error1') 
    functionToHandleOne()(); 
else 
    functionToHandleTwo()(); 
}); 
+0

這就是我的疑問是,如何調用functionToHandleOne()失敗someFactory.functionOne()和functionToHandleTwo()失敗someFactory.functionTwo()catch $ q.all()? –

+0

我編輯了我的答案 –

+0

這裏的問題是拒絕錯誤爲'error1'?我不能這樣做,因爲'e'將是一個動態值 –