2016-06-27 28 views

cevap

6

çoklu eşzamanlı http.get() istekleri çalıştırmak için() Observable.forkJoin kullanır http://jsfiddle.net/Zenuka/pHEf9/

angular.module('qAllSettled', []).config(function($provide) { 
    $provide.decorator('$q', function($delegate) { 
    var $q = $delegate; 
    $q.allSettled = function(promises) { 
     return $q.all(promises.map(function(promise) { 
     return promise.then(function(value) { 
      return { state: 'fulfilled', value: value }; 
     }, function(reason) { 
      return { state: 'rejected', reason: reason }; 
     }); 
     })); 
    }; 
    return $q; 
    }); 
}); 

Kab:

örneğe bakın. Tek bir istek başarısız olursa, tüm işlem hata durumuna neden olur.

getBooksAndMovies() { 
    Observable.forkJoin(
     this.http.get('/app/books.json').map((res:Response) => res.json()), 
     this.http.get('/app/movies.json').map((res:Response) => res.json()) 
    ).subscribe(
     data => { 
     this.books = data[0] 
     this.movies = data[1] 
     }, 
     err => console.error(err) 
    ); 
+0

Teşekkür: Burada

bir örnektir? – kabus

+6

downvote çünkü OP'lerden biri, bunlardan biri başarısız olursa, isteklerin nasıl devam edeceği sorusunu çözmez. ForkJoin, başarısız olan isteklerin tamamlanmasını bekliyor mu yoksa hemen kendini mi başarısız? – corolla

+0

@AngJobs Her dizi öğesi için hataları işlemenin bir yolu var mı? Kullanıcı arabirimini, başarısız olan belirli bir öğe için bir hata iletisiyle güncellemem gerekiyor. Res: block komutundan sonra bir (err) => {} ekledim ama sadece tüm dizi için son başarısızlığa atlıyor –

24

Sen hatayı yakalamak ve bu gibi durumlarda başka gözlemlenebilir dönmek her gözlemlenebilir için catch operatörü kaldıraç olabilir:

getBooksAndMovies() { 
    return Observable.forkJoin(
     this.http.get('/app/books.json').map((res:Response) => res.json()), 
     this.http.get('/app/movies.json').map((res:Response) => res.json()) 
    ); 

Ama hata işleyicisi içinde ek GET isteği koyabilirsiniz. Bir örnek verebilir, yanıt için

return Observable.forkJoin(
    this.http.get('/some-url') 
     .map((res:Response) => res.json()) 
     .catch(res:Response => Observable.of({}), 
    this.http.get('/some-other-url') 
     .map((res:Response) => res.json()) 
     .catch(res:Response => Observable.of({}), 
); 
İlgili konular