2015-12-24 9 views
7

Sto convertendo un servizio NG 1.X in NG 2.0.Angular 2.0 - conversione del concatenamento di promesse agli oggetti osservabili

mio NG servizio 1.X ha promessa concatenamento (semplificato):

dataService.search = function(searchExp) { 
     return this.getAccessToken() 
     .then(function(accesstoken) { 
     var url = $interpolate('https://my-api-url?q={{search}}&{{accesstoken}}')({search: searchExp, accesstoken: accesstoken}); 
     return $http({ 
      url: url, 
      method: 'GET', 
      cache: true 
     }); 
     }).then(function(response) { 
     return response.data; 
     }); 
    }; 

voglio convertire search servizio per essere un angolare 2.0 Service, utilizzando http e ritorno Observable. Preferisco lasciare intatto il servizio getAccessToken come servizio NG 1.X, che restituisce una promessa.

Stavo pensando di utilizzare Observable.fromPromise sul vecchio servizio "promessa".

Come posso farlo? Come posso incatenarli?

EDIT:

Giusto per chiarire, io voglio che sia qualcosa di simile:

dataService.search = function(searchExp) { 
return this.getAccessToken() 
     .then(function(accesstoken) { 
      //Here I want to use: 
      // this.http.get(url).subscribe(() => ...) 
      }); 
     }; 
+1

'Observable.fromPromise (dataService.search)'? –

+1

Questo è ovvio. Il mio problema è come posso restituire questo valore da una funzione? Non posso incatenarlo! –

risposta

8

si dovrebbe fare search metodo di ritorno oggetto osservabile. Qualcosa del genere:

dataService.search = function(searchExp) { 

    var promise = new Promise((resolve, reject) => { 
     this.getAccessToken() 
      .then(accesstoken => { 
       return this.http.get('data.json') 
        .map(response => response.json()) 
        .subscribe(data => resolve(data), err => reject(err)) 
      }) 
    }); 

    return PromiseObservable.create(promise); // Observable.fromPromise(promise) 
}; 
+0

Grazie per la risposta. La mia domanda è: come cambio la seconda promessa a diventare un 'http' di Angular 2.0 che usa Observable. –

+0

Vuoi dire interno $ http? – dfsq

+0

Ho modificato la mia domanda per chiarire –

3

Ho convertito il Plunker di @ dfsq in beta.0. map() non sembra essere più disponibile senza importarlo (ma non ne abbiamo bisogno qui).

import {Component, Injectable} from 'angular2/core'; 
import {HTTP_PROVIDERS, Http} from 'angular2/http'; 
import {PromiseObservable} from 'rxjs/observable/fromPromise'; 

@Injectable() 
export class DataService { 
    constructor(private _http: Http, private _accessService: AccessService) {} 
    search(searchExp) { 
    var promise = new Promise((resolve, reject) => { 
     this._accessService.getAccessToken() // see Plunker for AccessService 
     .then(accessToken => { 
      return this._http.get('data.json') // use accessToken here 
      .subscribe(res => resolve(res.json()), err => reject(err)); 
     }); 
    }); 
    return PromiseObservable.create(promise); 
    } 
} 
@Component({ 
    selector: 'my-app', 
    providers: [HTTP_PROVIDERS, AccessService, DataService], 
    template: `<h2>Data loaded</h2><pre>{{data | json}}</pre> 
    ` 
}) 
export class AppComponent { 
    data: any; 
    constructor(private _dataService: DataService) { 
    console.clear(); 
    } 
    ngOnInit() { 
    this._dataService.search('test') 
     .subscribe(res => { 
     this.data = res; 
     }); 
    } 
} 

beta.0 Plunker