【问题标题】:Angular2: How to make sure the execution will be run in order line by line?Angular2:如何确保执行将逐行运行?
【发布时间】:2017-09-11 20:34:12
【问题描述】:

我有一个 angular2 导航栏组件,其中包括一个注销按钮:

import { Component, OnInit } from '@angular/core';
import { LoginService } from '../login.service';
import { Router } from '@angular/router';

@Component({
  selector: 'app-navbar',
  templateUrl: './navbar.component.html',
  styleUrls: ['./navbar.component.css']
})
export class NavbarComponent implements OnInit {

    loggedIn: boolean;

    constructor(private loginService: LoginService, private router : Router) {
        if(localStorage.getItem('PortalAdminHasLoggedIn') == '') {
            this.loggedIn = false;
        } else {
            this.loggedIn = true;
        }
    }

    logout(){
        this.loginService.logout().subscribe(
            res => {
                localStorage.setItem('PortalAdminHasLoggedIn', '');
            },
            err => console.log(err)
            );

        this.router.navigate(['/login']);
        location.reload();
    }

    getDisplay() {
    if(!this.loggedIn){
      return "none";
    } else {
      return "";
    }
  }

  ngOnInit() {
  }

}

单击注销按钮时,我期望首先执行 LoginService 中的 logout() 函数,然后设置 localStorage 变量,然后导航到登录组件并重新加载页面。

但我意识到有时页面会在 LoginService 中执行 logout() 函数之前重新加载,因此这不会为 localStorage 设置新值。如何更正代码以便按顺序执行?

谢谢!

【问题讨论】:

  • 我建议您阅读有关如何处理 RxJS 和 observables 的内容,否则您将在 Angular 中遇到困难。这些方法是异步的,你不能让它逐行运行(就像在可观察对象之前的承诺和回调一样)。

标签: angular typescript


【解决方案1】:

任何时候您执行任何异步进程,例如您的注销,代码都将按顺序执行。 .subscribe 方法的参数实际上是一个回调方法,将在未来某个未定义的时间回调。因此,确保代码仅在完成后才执行的唯一方法是从 in subscribe 方法调用该代码。

logout(){
    this.loginService.logout().subscribe(
        res => {
            localStorage.setItem('PortalAdminHasLoggedIn', '');
            this.router.navigate(['/login']);
            location.reload();  // <-- what is this for?
        },
        err => console.log(err)
        );


}

我很好奇location.reload() 的用途。导航后不需要重新加载?

【讨论】:

  • 嗨 DeborahK,感谢您的解决方案。我将 location.reload() 放在那里,因为我想在导航后重新加载页面,如果不是,它只是导航而不刷新页面
  • 我以前没见过这样的。你真的需要重新加载整个页面吗?你能改为重新加载页面的数据吗?这似乎违背了 SPA 的想法?
  • 其实我的意思是当用户注销时,一切都会清楚,页面也会刷新
猜你喜欢
  • 1970-01-01
  • 2012-02-23
  • 2017-04-25
  • 1970-01-01
  • 2011-11-23
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
相关资源
最近更新 更多