2016-06-06 3 views
1

Ich fand diesen PLNKR-Link im Web, aber ich brauche ihn mit 2 oder 3 weiteren AJAX-Aufrufen, die kein Argument vom ersten AJAX-Aufruf erfordern. Wie kann ich es mit der Fehlerbehandlung machen?Wie kann ich die angularjs-Versprechungskette in einem Service und Controller verwenden?

var app = angular.module("app", []); 

app.service("githubService", function($http, $q) { 

    var deferred = $q.defer(); 

    this.getAccount = function() { 
    return $http.get('https://api.github.com/users/haroldrv') 
     .then(function(response) { 
     // promise is fulfilled 
     deferred.resolve(response.data); 
     return deferred.promise; 
     }, function(response) { 
     // the following line rejects the promise 
     deferred.reject(response); 
     return deferred.promise; 
     }); 
    }; 
}); 

app.controller("promiseController", function($scope, $q, githubService) { 

    githubService.getAccount() 
    .then(
     function(result) { 
     // promise was fullfilled (regardless of outcome) 
     // checks for information will be peformed here 
     $scope.account = result; 
     }, 
     function(error) { 
     // handle errors here 
     console.log(error.statusText); 
     } 
    ); 
}); 

http://plnkr.co/edit/kACAcbCUIGSLRHV0qojK?p=preview

+0

Geben Sie uns mehr Details über 'verschiedene Ajax calls' – WorkWe

+0

@WorkWe ich mehr meine, nicht anders, ich habe die Frage jetzt behoben. – Sam

+0

können Sie '$ q.all' verwenden, um zu warten, bis alle Versprechen gelöst sind wie' $ q.all ([promise1, promise2]). Dann (funtion (data) {// Erfolg}) ' –

Antwort

1

Sie $q.all

var promises=[ 
$http.get(URL1), 
$http.get(URL2), 
$http.get(URL3), 
$http.get(URL4) 
]; 

$q.all(promises).then(function(response){ 
console.log('Response of Url1', response[0]); 
console.log('Response of Url2', response[1]); 
console.log('Response of Url3', response[2]); 
console.log('Response of Url4', response[3]); 
}, function(error){ 

}); 

Ich habe Ihre plunkr mit $q

0

Verwenden $q.all in diesem Fall gegabelt verwenden können. Es wird getAccount und getSomeThing api gleichzeitig anrufen.

var app = angular.module("app", []); 

app.service("githubService", function($http, $q) { 

    return { 

    getAccount: function() { 
     return $http.get('https://api.github.com/users/haroldrv'); 
    }, 

    getSomeThing: function() { 
     return $http.get('some thing url'); 
    } 
    }; 

}); 

app.controller("promiseController", function($scope, $q, githubService) { 

    function initData() { 
    $q.all([githubService.getAccount(), githubService.getSomeThing()]) 
     .then(
     function (data) { 
      $scope.account = data[0]; 
      $scope.someThing = data[1]; 
     }, 
     function (error) { 

     } 
    ); 
    } 
}); 
1

Zuerst sollten Sie deferred für jede Ajax lokale Variable machen rufen Sie ein Versprechen zurückkehren möchten. Also, Sie müssen 2-3 Funktionen erstellen (so viele wie Ihre Ajax-Aufrufe) und sie in einem Array halten. Dann sollten Sie verwenden:

$q.all([ajax1,ajax2,ajax3]).then(function(values){ 
    console.log(values[0]); // value ajax1 
    console.log(values[1]); // value ajax2 
    console.log(values[2]);}); //value ajax3 

Beispiel:

function ajax_N() { 
    var deferred = $q.defer(); 

    http(...).then((response) => { 
     deferred.resolve(response); 
    }, (error) => { 
     deferred.reject(error); 
    }); 

    return deferred.promise; 
} 

$q.all([ 
     ajax_1,ajax_2,ajax_3 
    ]).then(function(values) {   
      console.log(values); 
      return values; 
     }); 
Verwandte Themen