2017-08-24 41 views
1

我为我的应用程序创建了一个自定义管道,它将用户标识作为参数并返回用户名。为了让所有的用户都能进行api调用。因此,我想从api获取用户列表后运行循环。我正在做这样的事情:从自定义管道返回异步值:Angular4

transform(userId: number): any { 
    this.userInfoService.getUsers().subscribe(
    data => { 
     this.allUsers = data; 
     for(let user of this.allUser) { 
     if(user.id === userId) { 
     return user.userName; 
     } 
     } 
     return null; 
    }, 
    error => { 
     console.log('Error'); 
    }) 
} 

但我没有看到任何价值的用户界面,当我使用这个管道。我怀疑的问题是异步返回的值。任何建议如何解决这个问题?

回答

2

我加了一个return,改变subscribemap

transform(userId: number): any { 
    return this.userInfoService.getUsers().map(
    data => { 
     this.allUsers = data; 
     for(let user of this.allUser) { 
     if(user.id === userId) { 
     return user.userName; 
     } 
     } 
     return null; 
    }, 
    error => { 
     console.log('Error'); 
    }) 
} 

然后用异步管

{{userId | myPipe | async}} 
+0

的作品就像一个魅力用它!但是,是否有任何其他解决方案,每次我将userId转换为userName时,都不会进行api调用?因为如果我在* ngFor中有很长的userIds列表,它会为每个userId做api调用。 – Aiguo

+0

不确定“每次我将userId转换为用户名”时,你的意思都完全相同。您可以使用缓存结果的共享服务。这可能有助于在这里https://stackoverflow.com/questions/36271899/what-is-the-correct-way-to-share-the-result-of-an-angular-2-http-network-call-in/ 36291681#36291681 –