角度异步功能仅在onInit上有效

时间:2019-09-05 14:52:33

标签: angular asynchronous

理解上的问题或这里的其他内容。

我彼此调用了两个方法,它们带有重新约定的承诺。当我在ngOnInit()中使用它时,它可以正常工作,但是当我单击一个按钮并且再次调用这两个方法时,它不再起作用了,我真的不知道为什么。试图用控制台日志进行调试,但这没有任何信息。

  profileLoaded: Observable<User>;

    ngOnInit() {
        this.getUserData().then(res => this.getProfileImageAndUpdateCountry());
    }

  getUserData() {
    return new Promise((resolve, reject) => {
      this.profileLoaded = this.userService.getProfile().pipe(
        tap(user => this.editForm.patchValue(user))
      );
      resolve();
    });
  }

  getProfileImageAndUpdateCountry() {
    this.profileLoaded.subscribe(
      userData => {
        console.log(userData);
        this.isoCodeOld = userData.country;
        this.country = userData.country;
        this.profileImage = userData.profileImage;
        this.userService.profileImageUpdate$.next(this.profileImage);
        this.checkCountries();
      });
  }

    console.log(this.editForm.get('country').value);

    setTimeout(a => {
      console.log("after: "+this.editForm.get('country').value);
    }, 500, [])

我将尝试解释问题。在我的ngOnInit()中,我调用了2个方法。关键是this.checkCountries();必须是最后一个被调用的东西,因为它会检查来自服务器的国家/地区数据(ISO代码)并将其转换为应用程序有效语言的完整语言名称。初始化后,它在正常视图和编辑视图以及“阿尔及利亚”中都可以代替“ DZ”很好地工作。

但是,如果我在编辑视图中并单击中止,则仅返回到该视图,我想再次调用此方法,因为现在可能已更新了某些内容。但是然后我可以通过日志看到this.checkCountries()被调用,并且它再次更改了名称,但是在短暂的超时后,如果我在输入字段中查看它是“ DZ”,因为(我至少认为,这是唯一的可能)this.editForm.patchValue(user)的调用尚未完成,并且会覆盖this.checkCountries()

的工作

那怎么可能?

0 个答案:

没有答案