【发布时间】:2017-08-02 17:10:19
【问题描述】:
我正在调用 MS Graph 来获取用户的照片:
// lets get the photo itself
let photo$ = this.graph.get$(`users/${id}/photo/$value`, ResponseContentType.Blob)
.map(resp => {
return new Blob([resp.blob()], { type: resp.headers.get['Content-Type']}); })
.map(photo => {
let urlCreator = window.URL;
return this.sanitizer
.bypassSecurityTrustUrl(urlCreator.createObjectURL(photo));
})
.catch(function (e) {
if(e.status === 404) {
// no photo for this user!
console.log(`No photo for user ${id}! Returning default...`);
return undefined;
}
})
.toPromise();
但是,许多用户没有照片。在这种情况下,我想做的是为一些默认照片(可能是these 之一)创建一个对象 URL,并从 Observable 发出它。或者甚至只是从 Observable 发出一个undefined,我可以通过显示一些默认图像在前端处理它。
我知道我的 catch 正在触发,因为我在浏览器控制台中看到了这个:
没有用户 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 的照片!返回 默认...(输出已编辑)
我实际上为每个用户提取了许多不同的数据位,每个用户都在自己的 Observable 中。然后我将每个 Observable 转换为 Promises,然后对所有这些执行 Promise.all()。
// let's pull all of this together to form a ConcreteUser
return Promise.all([photo$, ...])
.then(values => {
const photo = values[0];
...
问题是在用户照片出现 404 的情况下,整个 Promise.all 中止,我无法检索用户。
我尝试在 photo$ observable 中捕获错误并发出 undefined(我计划稍后处理),但它似乎并没有达到我想要的效果。
如何在我的 Observable 中处理 404,并发出其他内容(可能是 undefined)而不是杀死 observable?
【问题讨论】:
标签: angular typescript rxjs observable