Home > OS >  Argument of type 'Promise<any[]>' is not assignable to parameter of type 'reado
Argument of type 'Promise<any[]>' is not assignable to parameter of type 'reado

Time:06-03

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;
}
  • Related