Javascript 访问Angular Promise then()函数中的外部变量
各位晚上好。我想知道如何在Angular 2/4的typescript中访问Promise的Javascript 访问Angular Promise then()函数中的外部变量,javascript,angular,typescript,angular-promise,Javascript,Angular,Typescript,Angular Promise,各位晚上好。我想知道如何在Angular 2/4的typescript中访问Promise的then()中的外部变量。我试图通过RESTAPI完成动态表单验证,以检查用户名的可用性 这里userService.isUsernameAvailable(userName)返回一个完美工作的承诺。我唯一需要回答的是,我如何更改then()和catch()上的I值 下面不相关 以下内容与此问题无关:我在下面添加代码,为我试图实现的目标提供上下文。你不必读它,也不会增加我的问题 我的目标是为验证器返回一个
then()
中的外部变量。我试图通过RESTAPI完成动态表单验证,以检查用户名的可用性
这里userService.isUsernameAvailable(userName)
返回一个完美工作的承诺。我唯一需要回答的是,我如何更改then()
和catch()
上的I
值
下面不相关
以下内容与此问题无关:我在下面添加代码,为我试图实现的目标提供上下文。你不必读它,也不会增加我的问题
我的目标是为验证器返回一个返回null
的函数或一个JSON对象,因为验证器在Angular 2中就是这样工作的
static usernameAvailabilityValidator(userService: UserService) {
return (control: FormControl) : any =>{
let userName: string = control.value;
console.log("current username"+userName);
let i = 1;
let response:{} = null; //here response is similar to i
userService.isUsernameAvailable(userName).then((res) => {
i++;
if (res.status == 1) {
response = null;
}
else {
response = {'usernameInUse': 1};
}
}).catch((res) => {
response = null;
});
console.log("i"+i);
return response; // response is returned to the outside function
}
}
提前感谢大家。
isUsernameAvailable
返回承诺,因为它无法在被调用后立即返回值(例如,因为它等待网络请求)。因此,您的console.log(“i”+i)代码>和返回响应代码>在回调之前调用,然后在修改变量之前调用。因此,您的usernameavabilityvalidator
无法立即返回值,您可以返回承诺或使用TypeScript的async/await功能()。isusernameavability
返回承诺,因为它在被调用后无法立即返回值(例如,因为它等待网络请求)因此您的console.log(“i”+i)
和返回响应;
在回调之前被调用,然后在变量被修改之前被调用。因此,您的用户名可用性验证器不能立即返回值,您可以返回承诺或使用TypeScript的异步/等待功能().您需要为相同的应用程序实现异步验证程序
例如
您可以在这个&上找到关于验证器的更多信息。您需要为同一个验证器实现异步验证器
例如
你可以在这个&
static usernameAvailabilityValidator(userService: UserService) {
return (control: FormControl) : any =>{
let userName: string = control.value;
console.log("current username"+userName);
let i = 1;
let response:{} = null; //here response is similar to i
userService.isUsernameAvailable(userName).then((res) => {
i++;
if (res.status == 1) {
response = null;
}
else {
response = {'usernameInUse': 1};
}
}).catch((res) => {
response = null;
});
console.log("i"+i);
return response; // response is returned to the outside function
}
}
validate(c:AbstractControl) {
return new Promise(resolve =>
this.accountService.getUserNames(c.value).subscribe(res => {
if (res == true) {
resolve(null);
}
else {
resolve({validateEmailTaken: {valid: false}});
}
}));
}