【问题标题】:Promise resolve returning undefined when value needed承诺解决在需要值时返回未定义
【发布时间】:2020-09-30 08:14:20
【问题描述】:

当页面加载时,我想获取页面状态和登录的员工,以便可以使用信息来根据给定数据提取所有订单。问题是,无论我似乎在做什么功能:loadLoggedUser() 太迟返回活跃员工。我的 'console.log()' 函数目前在页面加载时会产生这个输出:

resolve one: undefined 
resolve two: 3 
id when needed: undefined 
data: 1 

这是组件中的函数,我想要实现的期望顺序是:loadLoggedUser() 然后 loadSelectedStatus() 然后一旦两者都完成了 if 语句,就可以根据从另一个收集的信息决定触发哪个函数两个功能。

export class OrdersComponent implements OnInit {
  activeUser = new Employee();

  constructor( public user: Employee ) {}

  ngOnInit(): void {
    this.initializePageData();
  }

  public initializePageData() {
    var self = this;
    this.loadLoggedUser()
      .then(function(resolve) {
        console.log(`resolve one: ${resolve}`);
        self.loadSelectedStatus()
          .then(function(resolve) {
            console.log(`resolve two: ${resolve}`);
            console.log(self.activeUser.id);
            if (self.selectedViewNumber == 2) {
              self.loadOrdersBySalesperson(self.activeUser.id);
            } else {
              if (self.selectedViewNumber == 3) { 
                self.loadOrdersByStatus(self.selectedStatus, 0);
              } else {
                self.loadOrdersByStatus(self.selectedStatus, self.activeUser.id);
              }
            }
          })
      });
  }

这些是 initizlizePageData() 中使用的函数的四个函数定义:

  public async loadLoggedUsername() {
    return new Promise<string>((resolve, reject) => {
      var loggedUsername = this.employeeService.getLoggedUsername();
      resolve(loggedUsername);
    });
  }

  public async loadLoggedUser() {
    var self = this;
    this.loadLoggedUsername().then(function(res) {
      var loggedUsername = res;
      return new Promise<any>((resolve, reject) => {
        self.employeeService.getEmployeeByUsername(loggedUsername).subscribe(data => {
          self.activeUser = data;
          console.log(`data: ${data.id}`);
          resolve(data.id);
        });
      });
    });
  }

  public async loadSelectedStatus() {
    return new Promise<number>((resolve, reject) => {
      this.activatedRoute.queryParams.subscribe(params => {
        this.selectedStatus = params['status'];

        if (!this.selectedStatus) {
          this.selectedStatus = 3; 
        }
        resolve(this.selectedStatus);
      });
    });
  }

  public loadOrdersByStatus(selectedStatus: number, userId: number) {
    this.orderService.getOrdersByStatus(selectedStatus, userId).subscribe(res => {
      this.ordersArray = res;
    });
  }

  public loadOrdersBySalesperson(userId: number) {
    this.orderService.getOrdersBySalesperson(userId).subscribe(res => {
      this.ordersArray = res;
    });
  }
}

非常感谢任何输入或反馈。

【问题讨论】:

    标签: angular typescript promise async-await


    【解决方案1】:

    您的loadLoggedUser() 函数中缺少return 关键字。

    更改语句

    this.loadLoggedUsername().then(function(res) { ... 
    

    return this.loadLoggedUsername().then(function(res) { ...
    

    【讨论】:

    • 我认为这是我缺少的一些简单的东西,非常感谢您的回复!很有道理。
    猜你喜欢
    • 1970-01-01
    • 2022-01-27
    • 2015-09-27
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2019-06-15
    相关资源
    最近更新 更多