传入值在 Angular 应用中的 运行 函数时不可用

Passed-in Values Not Available at Run-time of Function in Angular App

我意识到在 何时 某些功能的产品在 JavaScript 中可用的方式和具体而言,我缺少一些东西。

在我的 Angular 应用程序中,为了获取用户的姓名首字母,我正在解析从 API 返回的数据,并检索 firstName 的第一个字母,以及第一个两个不同函数中姓氏的字母。这两个功能按预期工作,我可以在控制台中看到正确的结果:

getFirstNameFirstLetter() {
    if (this.authenticationService.isAuthenticated()) {
        const userObj = JSON.parse(sessionStorage.getItem('currentUser'));
        const userInfo = userObj.data;
        const firstName = userInfo.name.first;
        const firstNameFirstLetter = firstName.trim().charAt(0);
        console.log(firstNameFirstLetter);
        return firstNameFirstLetter;
    }
}

getLastNameFirstLetter() {
    if (this.authenticationService.isAuthenticated()) {
        const userObj = JSON.parse(sessionStorage.getItem('currentUser'));
        const userInfo = userObj.data;
        const lastName = userInfo.name.last;
        const lastNameFirstLetter = lastName.trim().charAt(0);
        console.log(lastNameFirstLetter);
        return lastNameFirstLetter;
    }
}

现在是我不完全理解的部分。当我然后传递这两个函数的返回值时,为了得到缩写,像这样:

getInitials(firstNameFirstLetter, lastNameFirstLetter) {
    if (this.authenticationService.isAuthenticated()) {
        if (!this.firstNameFirstLetter || !this.lastNameFirstLetter) {
            console.log('Names not ready!');
            return;
        } else if (this.firstNameFirstLetter && this.lastNameFirstLetter) {
            console.log(firstNameFirstLetter + lastNameFirstLetter);
            return firstNameFirstLetter + lastNameFirstLetter;
        }
    }
}

... 我每次都会将 "Names not ready!" 打印到控制台。

顺便说一下,我 运行 在 Angular 的 ngOnInit 生命周期挂钩中使用这些函数,如下所示:

ngOnInit() {
    this.getFirstNameFirstLetter();
    this.getLastNameFirstLetter();
    this.getInitials(this.firstNameFirstLetter, this.lastNameFirstLetter);
}

我知道这与什么时候可用有关,因为当我使用断点并调试传递给 "getInitials()" 函数的两个值时,我得到 'undefined'。换句话说,该函数在 运行 时无法访问其他两个函数的返回值——因此我将 'Names not ready!' 打印到控制台。我的问题是,在架构上我缺少什么来解决此类问题?

所以这里发生的事情是 JavaScript 认为您没有使用 getFirstNameFirstLetter 和 getLastNameFirstLetter 的 return 值,所以当它发出调用时,而不是等待调用完成后,它继续进行下一个,它引入了竞争条件。如果您只是将其更改为

ngOnInit() {
    let temp1 = this.getFirstNameFirstLetter();
    let temp2 = this.getLastNameFirstLetter();
    this.getInitials(this.firstNameFirstLetter, this.lastNameFirstLetter);
}

然后它会等待前面的函数完成再调用下一个。


此外,我不经常使用 const,所以我可能是错的,它可能遵循不同的作用域规则,但按照正常的作用域规则,在该函数中设置一个变量,它仅在该函数中可用,您需要将其设置为

this.firstNameFirstLetter = firstName.trim().charAt(0);

在函数外访问它。


或者一箭双雕

ngOnInit() {
    this.firstNameFirstLetter = this.getFirstNameFirstLetter();
    this.lastNameFirstLetter = this.getLastNameFirstLetter();
    this.getInitials(this.firstNameFirstLetter, this.lastNameFirstLetter);
}

ngOnInit() {
    let firstNameFirstLetter = this.getFirstNameFirstLetter();
    let lastNameFirstLetter = this.getLastNameFirstLetter();
    this.getInitials(firstNameFirstLetter, lastNameFirstLetter);
}

取决于您是再次需要这些变量还是仅针对该功能。