角度:需要解决一系列操作链(可观察)

时间:2018-08-06 16:50:48

标签: javascript angular rxjs observable

在用户登录我的应用程序(将其缓存在服务中)后,我想首先准备好一堆数据。

我认为,如果登录成功,将在解析父路由之前将这种数据加载逻辑实现为Resolver

更具体地说:在显示用户主页之前,我希望已经加载了一个数据列表,如果该列表不为空,则默认情况下将该列表的第一个元素设置为selected元素。因此,这意味着两个Services

  • ItemsService:此服务将知道如何请求项目列表,并在第一个请求完成后将其保留在缓存中
  • ItemSelectedService:此服务将随时知道已将哪个项目设置为选中状态

以及以下Resolver

@Injectable()
export class ItemsResolver implements Resolve<any> {

  constructor(
    private itemSelectedService: ItemSelectedService,
    private itemsService: ItemsService
  ) { }

  resolve() {
    this.itemsService.getAll()
      .subscribe((items) => {
        if (items.length > 0) {
          this.itemSelectedService.setAsSelected(items[0]);
        }
      });
  }

}

#resolve()需要返回一个Observablereturn this.itemsService.getAll()就足够了...),但我没有返回任何内容,因为我需要订阅并致电{{1 }}一旦异步获取了项目列表,什么才是实现所需行为的正确方法?

2 个答案:

答案 0 :(得分:1)

尝试点按

def UpdatePerson(image, x, y):
    screen.blit(image, x, y)

while carryOn:

    ...
    ...

    oldX = w_x
    oldY = w_y

    w_x,w_y = worker.create_randomPATH(w_x,w_y)


    while(oldX < w_x || oldY < w_y):
        randomDir = random.randint(1,2)

        if randomDir == 1 && oldX < w_x:
            UpdatePerson(worker.image, oldX, w_y)
            oldX += 1
        elif randomDir == 2 && oldY < w_x
            UpdatePerson(worker.image, w_x, oldY)
            oldY += 1
  

做/点击
  透明地执行操作或副作用,例如日志记录。   https://www.learnrxjs.io/operators/utility/do.html

答案 1 :(得分:0)

您可以使用 flatmap 来解决链中可观测的问题

@Injectable()
export class ItemsResolver implements Resolve<any> {

  constructor(
    private itemSelectedService: ItemSelectedService,
    private itemsService: ItemsService
  ) { }

  resolve() {
    return this.getAll()
      .pipe(
        flatmap(items => this.setSelectService(item[0]))
      )
  }

  getAll() {
    return this.itemsService.getAll();
  }

  setSelectService(item) {
    return this.itemSelectedService.setAsSelected(item);
  }

}