javascript 无法等到promise被解析

jk9hmnmh  于 2023-04-28  发布在  Java
关注(0)|答案(2)|浏览(168)

我被一个与工作相关的任务卡住了,我从数据库中获取数据,然后通过post请求将数据发送到外部API。现在,我成功地获取了数据并进行了处理,但是在promise被解析之前,外部API请求就已经通过了。
因此,我有了一个名为EmployeeService的服务类,我从数据库中获取一些数据并对其进行处理。为了使它更可读,我将每个步骤分离在单独的方法中。

class EmployeeService {
  constructor() {
    this.employeeRepository = new EmployeeRepository();
  }

  getData(employeeId, department {
    return {
      name       : 'John Doe',
      attendance : this.getAttendanceHistory(employeeId, department)
    };
  }

  async getAttendanceHistory(employeeId, department) {
    if (department === 'accounts') {
      return await this.#getAccountsDepartmentHistory(employeeId);
    }
  }

  async #getAccountsDepartmentHistory(employeeId) {
    const 
      cursor = await this.employeeRepository
        .getHistory(
          employeeId
        ),
      
      messages  = await cursor.toArray();
      
    return messages.map((entry) => this.employeeService.processHistory(entry));
  }
}

上面的getData方法是从另一个名为EmployeeRecordsService的服务调用的,然后调用apiService并将数据发送到外部端点。

class EmployeeRecordsService {
  constructor() {
    this.employeeService = new EmployeeService();
    this.apiService      = new ApiService();
  }

  sendData() {
    const data     = this.employeeService.getData('123', 'accounts');
    const response = this.apiService.send(data);

    return response;
  }
}
class ApiService {
  async send(data) {
    console.log('final data: ', data)

    return await this.request(
      data
    );
  }

}

在EmployeeService中,如果我记录getAccountsDepartmentHistory的返回值,我将获得所有的历史记录,并解决promise。同样,如果我记录getAttendanceHistory的值,promise也会被解析。但是,如果我记录getData的返回值,它要么是挂起的,要么是空数组或空对象。此外,final data log被调用时没有出勤数据,对象为空。我尝试了不同的方法来解决getData方法中的promise,比如Promise。决心,承诺。all和async/await,则final data log显示Promise Pending。
如何在EmployeeService中解析promise,而不是在上面的其他服务中解析?为什么EmployeeService中的每个方法都返回一个promise,即使我使用的是await
请注意,在获取EmployeeRecordsService中的数据之前,我需要在EmployeeService中解析promise。我尽量避免在其他部分项目的变化,因为很多事情可能会打破。

krcsximq

krcsximq1#

不幸的是,当你有Promise / async动作时,所有async函数的调用者(在本例中getAttendanceHistory是async)都需要处理这些Promise。不管你是否已经在这些函数中使用了await。修复问题的建议是确保asyncawait

class EmployeeService {
  constructor() {
    this.employeeRepository = new EmployeeRepository();
  }

  async getData(employeeId, department) {
    return {
      name: 'John Doe',
      attendance: await this.getAttendanceHistory(employeeId, department),
    };
  }

  async getAttendanceHistory(employeeId, department) {
    if (department === 'accounts') {
      return await this.#getAccountsDepartmentHistory(employeeId);
    }
  }

  async #getAccountsDepartmentHistory(employeeId) {
    const cursor = await this.employeeRepository.getHistory(employeeId),
      messages = await cursor.toArray();

    return messages.map((entry) => this.employeeService.processHistory(entry));
  }
}

class EmployeeRecordsService {
  constructor() {
    this.employeeService = new EmployeeService();
    this.apiService = new ApiService();
  }

  async sendData() {
    const data = await this.employeeService.getData('123', 'accounts');
    const response = this.apiService.send(data);

    return response;
  }
}
zlwx9yxi

zlwx9yxi2#

sendData不执行任何一个promise。你需要真正的await你对getDatasend的调用,这些函数在它们的实现内部是异步的是不够的;堆栈中的调用者也必须是异步的,并且必须await正在返回的promise。

相关问题