I have a code like this-
async function fetchData() {
xlData.map(async (student, id) => {
const studentExist = await User.findOne({
email: student.email,
});
if (studentExist) {
let includesStudent = await Class.findOne({
student: { $in: [studentExist._id] },
});
if (!includesStudent) {
studentsIds.push(studentExist._id);
}
}
});
return studentsIds;
}
const finalData: any[] = await Promise.all(fetchData());
console.log("final data", finalData);
I am getting an error as follows:
No overload matches this call. Overload 1 of 2, '(values: readonly unknown[] | []): Promise<unknown[] | []>', gave the following error.
Argument of type 'Promise<any[]>' is not assignable to parameter of type 'readonly unknown[] | []'.
Type 'Promise<any[]>' is not assignable to type '[]'. Overload 2 of 2, '(values: Iterable<any>): Promise<any[]>', gave the following error.
Argument of type 'Promise<any[]>' is not assignable to parameter of type 'Iterable<any>'.
Property '[Symbol.iterator]' is missing in type 'Promise<any[]>' but required in type 'Iterable<any>'.ts(2769)
How to solve this?
CodePudding user response:
The function is not returning a promise,
The first approach it's not dependent on the studentsIds array.
const fetchData = () => {
const promises = xlData.map(async (student, id) => {
const studentExist = await User.findOne({
email: student.email,
});
if (studentExist) {
let includesStudent = await Class.findOne({
student: { $in: [studentExist._id] },
});
if (!includesStudent) {
return studentExist._id;
}
}
});
return promises;
};
const result: any[] = await Promise.all(fetchData());
//remove undefined
const students = result.filter((student) => Boolean(student));
console.log("final data", students);
OR
async function fetchData() {
await Promise.all(
xlData.map(async (student, id) => {
const studentExist = await User.findOne({
email: student.email,
});
if (studentExist) {
let includesStudent = await Class.findOne({
student: { $in: [studentExist._id] },
});
if (!includesStudent) {
studentsIds.push(studentExist._id);
}
}
})
);
return studentsIds;
}