检测$ q.all的错误

时间:2016-01-08 16:32:20

标签: javascript angularjs ionic-framework ionic

我有以下服务,其中包含获取系统所有仪表板数据的功能。

.service('dashboardServices', function ($http, $q) {
return {
    getData: getData
}

//definition of promises and their http requests urls
var promise01 = $http({method: 'GET', url: urlpromise01, cache: false});
var promise02 = $http({method: 'GET', url: urlpromise02, cache: false});
var promise03 = $http({method: 'GET', url: urlpromise03, cache: false});

function getData(){
    var promises = [];
        var promises = $q.all([promise01, promise02, promise03])
                            .then(function(data){
                                setDashboardData(data[0].data);
                                setDashboardData(data[1].data);
                                setDynamicDashboardData(data[2].data);
                                })
        return promises;
}
})

我在我的控制器中调用此服务,以便在从服务器获取数据时打开带有加载消息的模式窗口。

.controller('MainCtrl', function($state, $scope, $ionicModal, dashboardServices) {
$ionicModal.fromTemplateUrl('views/loading.html', {
    scope: $scope,
    backdropClickToClose: false,
    hardwareBackButtonClose: true,
    animation: 'slide-in-up'
}).then(function(modal) {
    $scope.modal = modal;
});

$scope.openModal = function() {
    $scope.modal.show().then(function() {
        dashboardServices.getData().then(function() {
            $scope.closeModal();
        })
    })
}

$scope.closeModal = function() {
    $scope.modal.hide();
};
})

现在我希望在请求失败的情况下显示某种消息。因为现在至少有一个请求失败,加载模式窗口永远不会被关闭。 但是我不能在我的控制器中添加.error(function()...它会抛出一个错误,说$ .t.all

不支持.then()....。error()

实现此异常处理的可能方法是什么?

2 个答案:

答案 0 :(得分:4)

.then(...).error(...)不仅不受$q.all支持,还受$q承诺和一般承诺的支持。您可能会将其与“错误”相混淆。回调,你正在寻找的东西是catch

$q.all([...]).then(onSuccess).catch(onError);

这可能是

的另一种形式
$q.all([...]).then(onSuccess, onError);

但是suited better for readability。或者它可能不是,如果有必要将all(...)中的错误与链的其余部分分开处理,在这种情况下它必须是

$q.all([...]).then(onAllSuccess, onAllError).catch(onError);

答案 1 :(得分:3)

    <?php 

    //$param = array('isbn'=>'0385503954');
    // define path to server application
    $opts = array(
                'ssl' => array('ciphers'=>'RC4-SHA', 'verify_peer'=>false, 'verify_peer_name'=>false)
            );

    // SOAP 1.2 client
    $params = array (
        'encoding' => 'UTF-8', 
        'verifypeer' => false, 
        'verifyhost' => false, 
        'soap_version' => SOAP_1_2, 
        'trace' => 1, 'exceptions' => 1, 
        "connection_timeout" => 180, 
        'stream_context' => stream_context_create($opts) );

    //disable wsdl cache 
    ini_set("soap.wsdl_cache_enabled", "0"); 

    $server = '';

     
    $client = new SoapClient("http://www.example.com?WSDL",$params);

    $result1=$client->getSiteInfo();
      
    $zone = $result1->Sites;
    if(isset($_POST['rayat'])){
        echo $zone;
    }
     else {
        

    ?>


    <form action="champ.php" method="post">

    <input id="rayat" name="rayat" size="10" type="text" value=""  />
    <input id="submit" name="submit" type="submit" value="submit" />

    </form>

    <?php
     }
     ?>