我被一个与工作相关的任务卡住了,我从数据库中获取数据,然后通过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。我尽量避免在其他部分项目的变化,因为很多事情可能会打破。
2条答案
按热度按时间krcsximq1#
不幸的是,当你有Promise / async动作时,所有async函数的调用者(在本例中
getAttendanceHistory
是async)都需要处理这些Promise。不管你是否已经在这些函数中使用了await
。修复问题的建议是确保async
和await
:zlwx9yxi2#
sendData
不执行任何一个promise。你需要真正的await
你对getData
和send
的调用,这些函数在它们的实现内部是异步的是不够的;堆栈中的调用者也必须是异步的,并且必须await
正在返回的promise。