2015-12-24 54 views
7

我將NG 1.X服務轉換爲NG 2.0。Angular 2.0 - 將承諾鏈接轉換爲Observables

我NG 1.X服務有承諾鏈接(簡體):

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; 
     }); 
    }; 

我想轉換search服務是一個角2.0服務,使用http和返回Observable。我寧願保留getAccessToken服務作爲NG 1.X服務,它返回一個承諾。

我正在考慮在舊的「承諾」服務上使用Observable.fromPromise

我該怎麼辦呢?我怎樣才能鏈接這兩個?

編輯

只是爲了澄清,我希望它是這樣的:

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

這很明顯。我的問題是如何從函數返回此值?我無法鏈接它! –

回答

8

你應該讓search方法的返回可觀察對象。類似這樣的:

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

感謝您的回答。我的問題是如何更改第二個承諾,使其成爲使用Observable的Angular 2.0'http'。 –

+0

你的意思是內部$ http? – dfsq

+0

我編輯了我的問題,以澄清 –

3

我將@ dfsq的Plunker轉換爲beta.0。 map()似乎沒有導入它(但我們不需要它在這裏)。

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