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

Posted

技术标签:

【中文标题】Angular App 中函数运行时传入的值不可用【英文标题】:Passed-in Values Not Available at Run-time of Function in Angular App 【发布时间】:2017-10-23 21:07:26 【问题描述】:

我意识到在 javascript 中某些函数的产品如何以及特别是何时可用方面我缺少一些东西。

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

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;
        
    

...我收到“名称未准备好!”每次打印到控制台。

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

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

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

【问题讨论】:

我不同意,这不是简单的“我的代码有问题,请为我解决”,这是对他们为什么得到他们得到的结果的误解。这正是堆栈溢出的原因。 【参考方案1】:

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

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);

取决于您是再次需要变量还是仅用于该函数。

【讨论】:

非常感谢,@Joo_Beck!您的两个“用一块石头杀死两只鸟”中的第一个建议的解决方案有效: ngOnInit() this.firstNameFirstLetter = this.getFirstNameFirstLetter(); this.lastNameFirstLetter = this.getLastNameFirstLetter(); this.getInitials(this.firstNameFirstLetter, this.lastNameFirstLetter); 所以基本上,这里发生的是,在 OnInit 中,我首先将值分配给两个函数的结果。然后我正在运行“getInitials()”函数——它确保值在函数运行时可用。

以上是关于Angular App 中函数运行时传入的值不可用的主要内容,如果未能解决你的问题,请参考以下文章

如果值不可用,则获取上个月的值

vue为啥method值不改

使用 C# 计算的可用磁盘空间与我的电脑中显示的值不匹配

angularJS 可编辑下拉选项框

Angular 5 带参数的组件输入函数

if判断Integer类型的值不等于‘‘导致的查询条件限制缺失