Тип возврата в асинхронной функции с использованием mongoose выдает ошибку - PullRequest
0 голосов
/ 03 июля 2018

Я получаю сообщение об ошибке при попытке скомпилировать следующий код:

public getCompanies(): Array<ICompany>{
    Company.find({}, (err, data)=>{
        if (err) console.log(err);
        let companyArray = new Array();
        for (let company of data){
            companyArray.push(company);
        }
        return companyArray;
    });
}

Произошла ошибка с типом возврата функции: ошибка TS2355: Функция, объявленный тип которой не является ни void, ни any, должна возвращать значение.

Получил ту же ошибку, используя функции then / catch.

Есть ли способ заставить эту работу работать без преобразования типа возвращаемого значения в любой ?

Заранее спасибо

1 Ответ

0 голосов
/ 03 июля 2018

Компилятор прав в том, что ваша функция фактически не возвращает никакого значения.

Проблема в том, что 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);
            })
    }
}
...