Компилятор прав в том, что ваша функция фактически не возвращает никакого значения.
Проблема в том, что Company.find
принимает обратный вызов, который выполняется позднее, когда запрошенный запрос конкурирует. Таким образом, все, что вы напишите после (err, data)=>{
, не будет выполнено при вызове getCompanies
, и return
, который у вас есть, - это не возвращение из getCompanies
, а скорее возврат из анонимной функции, которая будет выполнена позже.
Вы можете использовать аналогичный подход (передавая обратный вызов), чтобы получать уведомления о завершении запроса:
class foo {
public getCompanies(onCompleted: (data: ICompany[])=> void): void{
Company.find({}, (err, data)=>{
if (err) console.log(err);
let companyArray = new Array();
for (let company of data){
companyArray.push(company);
}
onCompleted(companyArray);
});
}
public usage(){
this.getCompanies(data=>
{
console.log(data);
})
}
}
Или вы можете просто вернуть DocumentQuery
, который find
возвращает, и использовать then
или async/await
, чтобы получить результат:
class foo {
public getCompanies() {
return Company.find({}, (err, data)=>{
if (err) {
console.log(err);
}
let companyArray = new Array();
for (let company of data){
companyArray.push(company);
}
});
}
public async usageAsync(){
let data = await this.getCompanies();
console.log(data);
}
public usage(){
this.getCompanies()
.then (data=>
{
console.log(data);
})
}
}