Javascropt中的可变范围

时间:2017-08-04 08:45:47

标签: javascript angular asynchronous scope


我在javascript中遇到变量范围问题。我有以下代码可以正常工作,但this.myUser的值超出undefined块时会.subscribe(...)成为private myUser: User; login(username: string, password: string): User { this.http.get(this.loginUrl + '?username=' + username + '&password=' + password) .map((response : Response) => response.json()) .subscribe(data => { console.log('data inside', data); this.myUser = data; console.log('user inside', this.myUser); } ); console.log('user outside', this.myUser); return this.myUser; } 。我不明白为什么,因为它是一个类变体。这是我的代码:

angular 4

以下是控制台日志的结果: github page

我将bootstrap 4promise一起使用(但我认为这对此问题没有任何影响)。 谢谢你的提示。

修改 我点击下面的链接,因此我尝试将Angular添加到我的代码中以管理异步调用。在线教程似乎都非常简单(确实太简单,包括this.http.get(this.loginUrl + '?username=' + username + '&password=' + password) .toPromise() .then(data => { console.log('data inside', data); this.myUser = data.json() as User; console.log('user inside', this.myUser); }) .catch(console.log.bind('Error!')); 官方参考),所以我最终得到了类似的东西:

public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool{
    return SDKApplicationDelegate.shared.application(app, open: url, options: options)
}

但它对申请流程没有任何影响。我会继续努力,但任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

如果你做了这个改变。

private myUser: User;

login(username: string, password: string) = () : User =>  {

  this.http.get(this.loginUrl + '?username=' + username + '&password=' + password)
  .map((response : Response) => response.json())
  .subscribe(data => {
    console.log('data inside', data);
    this.myUser = data;
    console.log('user inside', this.myUser);
  }
  );

  console.log('user outside', this.myUser);

  return this.myUser;
}

登录功能的调用者没有作用域对象。使用typescript中的箭头函数将使用局部变量持久化this / instance来引用函数的包含类。

答案 1 :(得分:0)

问题是,当您点击此行时,观察结果未完成:

console.log('user outside', this.myUser);

Observables是异步的。只有在AJAX调用(this.http.get)成功后才会执行订阅块。 console.log语句将在创建observable后立即执行。