2017-06-06 68 views
1

這是我的get方法。無法訂閱數據使用一個訂閱功能在離子2

get(url: string, options?: RequestOptionsArgs): Promise<Observable<{}>> { 
    return new Promise((resolve, reject) => { 
     this._frotzOptions(url, options).then((data) => { 
     if (data) { 
      resolve(this.http.get(url, data)); 
     } else 
      resolve(false); 
     }).catch((err) => { 
     reject(err); 
     }); 
    }); 
    } 

_frotzOptions方法。

 private _frotzOptions(urlo: string | Request, options: RequestOptionsArgs): Promise<{}> { 
    if (!options) { 
     options = {} 
    } 
    if (!options.headers) { 
     options.headers = new Headers(); 
    } 
    return new Promise((resolve, reject) => { 
     this.storage.get('token').then(token => { 
     options.headers.append('Content-Type', 'application/json'); 
     options.headers.append('Authorization', 'Bearer ' + token); 
     if (token) { 
      resolve(options); 
     } 
     else 
      resolve(false); 
     }).catch((err) => { 
     reject(err); 
     }); 
    }); 

    } 

home.ts

var subscription = Observable.fromPromise(this.ahttp.get(url)); 
subscription.subscribe((data) => { 
    data.subscribe(rsp => { 
    console.log("rsp", rsp); 
    }) 
}, (err) => { 
    console.log(err) 
}); 

當我需要使用這些解決來回GET方法的數據,我必須使用內訂閱的預約!使用訂閱來完成此操作的最佳方法是什麼!有什麼建議麼!謝謝!

回答

0

嗨,爲什麼難道你只是這樣做:

private _frotzOptions(urlo: string | Request, options: RequestOptionsArgs): Observable<any> { //<--!! CHANGE TO OBSERVABLE from Rx/rx 
if (!options) { 
    options = {} 
} 
if (!options.headers) { 
    options.headers = new Headers(); 
} 
return new Promise((resolve, reject) => { 
    this.storage.get('token').then(token => { 
    options.headers.append('Content-Type', 'application/json'); 
    options.headers.append('Authorization', 'Bearer ' + token); 
    if (token) { 
     resolve(options); 
    } 
    else 
     resolve(false); 
    }).catch((err) => { 
    reject(err); 
    }); 
}); 

,然後當你要使用它:

this.ahttp.get(url).subscribe((data) => { 
    data.subscribe(rsp => { 
    console.log("rsp", rsp); 
    }) 
}, (err) => { 
    console.log(err) 
}); 

而在去年...注入在請求您的承載令牌使用INTERCEPTOR ......也許有像一些插件:

https://www.npmjs.com/package/angular2-http-interceptor 
0

使用新的承諾,在構造另一p romise/observable是一個antipattern。 轉換你的可觀察性,並返回它。

get功能可以簡化爲:

get(url: string, options?: RequestOptionsArgs): Promise<{}> { 
    return this._frotzOptions(url, options).then((data) => { 
     if (data) { 
      return this.http.get(url, data).toPromise(); //use Observable toPromise function 
     } else 
      return false; 
    }).catch((err) => { 
     console.log(err); // handle error 
    }); 
    } 

而且你_frotzOptions功能:

private _frotzOptions(urlo: string | Request, options: RequestOptionsArgs): Promise<{}> { 
    if (!options) { 
     options = {} 
    } 
    if (!options.headers) { 
     options.headers = new Headers(); 
    } 
    return this.storage.get('token').then(token => { 
     options.headers.append('Content-Type', 'application/json'); 
     options.headers.append('Authorization', 'Bearer ' + token); 
     if (token) { 
      return options; 
     } 
     else 
      return false; 
    }); 
    } 

這就是所謂的promise chaining