2017-03-12 30 views
5

我打电话MS图获得用户的照片处理404:RxJs可观测 - 通过发射默认值

// 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,我可以通过显示一些默认图像在前端处理。

我知道我的渔获射击,因为我看到这个浏览器控制台:

No photo for user xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx! Returning default... (output redacted)

我确实拉动数据的许多不同的位为每一个用户,在各自观察到。然后,我将这些Observable中的每一个转换为Promise,然后对它们进行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$中捕获错误并发出undefined(我打算稍后处理),但它似乎没有按照我的要求做。

如何处理404在我这里可观察到,并发出,而不是杀死观察到别的东西(也许undefined)?

回答

4

我想我可能已经想通了。一个提示是潜伏在浏览器控制台...

TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.

读RxJs documentation on error handling表明他们在做什么,我试图做的,所以我就有点这个困惑。但后来我注意到在文档中他们称之为getCachedVersion()的神秘功能,我认为它返回了一个实际的缓存事物。但是,如果他们返回一个实际缓存的东西,那么这可能会解释它。

当我改变了我的捕捉代码:

 .catch(function (e) { 
      if(e.status === 404) { 
       // no photo for this user! 
       console.log(`No photo for user ${id}! Returning default...`); 
       return Observable.of(undefined); 
      } 
     }) 

...这一切开始工作。