Javascript 访问Angular Promise then()函数中的外部变量

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值 下面不相关 以下内容与此问题无关:我在下面添加代码,为我试图实现的目标提供上下文。你不必读它,也不会增加我的问题 我的目标是为验证器返回一个

各位晚上好。我想知道如何在Angular 2/4的typescript中访问Promise的
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}});
        }
    }));
  }