AngularFire Storage getDownloadURL()调用then()报错求助
解决AngularFire Storage getDownloadURL()无法调用then()的问题
看起来你碰到的问题是因为你使用的AngularFire Storage版本中,getDownloadURL()返回的是RxJS的Observable(具体是PromiseObservable),而不是原生的JavaScript Promise,所以直接调用.then()会触发"not a function"的错误。下面给你两种实用的解决办法:
方法一:将Observable转换为Promise(使用toPromise)
这种方式可以保留你习惯的Promise链式调用风格,不过需要先导入RxJS的toPromise操作符:
// 先在文件顶部导入toPromise操作符 import 'rxjs/add/operator/toPromise'; // 然后修改你的代码逻辑 constructor(public navCtrl: NavController, private afDB: AngularFireDatabase, private afStorage: AngularFireStorage) { let ref = this.afStorage.ref('test.jpg'); ref.getDownloadURL() .toPromise() .then(url => { console.log('下载链接:', url); }) .catch(error => { console.error('获取链接失败:', error); }); }
方法二:直接订阅Observable(Angular推荐方式)
Angular生态本身大量依赖RxJS,直接订阅Observable是更符合Angular开发习惯的做法,还能更好地配合组件生命周期管理(比如组件销毁时取消订阅,避免内存泄漏):
constructor(public navCtrl: NavController, private afDB: AngularFireDatabase, private afStorage: AngularFireStorage) { let ref = this.afStorage.ref('test.jpg'); ref.getDownloadURL().subscribe( url => { console.log('下载链接:', url); }, error => { console.error('获取链接失败:', error); } ); }
补充说明
你看到的PromiseObservable是RxJS中一种兼容Promise行为的Observable类型,但它本质还是Observable,不支持Promise的.then()方法。如果后续你升级到AngularFire v6及以上版本,getDownloadURL()会直接返回原生Promise,那时候就可以直接用.then()了。
内容的提问来源于stack exchange,提问作者chles
相关产品推荐
相关产品推荐

