我在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 4
与promise
一起使用(但我认为这对此问题没有任何影响)。
谢谢你的提示。
修改
我点击下面的链接,因此我尝试将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)
}
但它对申请流程没有任何影响。我会继续努力,但任何帮助都会受到赞赏。
答案 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后立即执行。