使用猫鼬的异步函数中的返回类型会产生错误
Posted
技术标签:
【中文标题】使用猫鼬的异步函数中的返回类型会产生错误【英文标题】:Return type in asynchronous function using mongoose produces error 【发布时间】:2018-12-11 09:59:20 【问题描述】:我在尝试编译以下代码时遇到错误:
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;
);
函数的返回类型有错误:error TS2355:声明类型既不是'void'也不是'any'的函数必须返回一个值。
使用 then/catch 函数时遇到了同样的错误。
有没有办法在不将返回类型转换为 any 的情况下完成这项工作?
提前谢谢你
【问题讨论】:
【参考方案1】:编译器是正确的,你的函数实际上没有返回任何值。
问题是Company.find
需要一个回调,该回调在稍后请求的查询完成时执行。因此,当您调用 getCompanies
时,您在 (err, data)=>
之后编写的所有内容都不会被执行,而您拥有的 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);
)
或者您可以只返回 find
返回的 DocumentQuery
并使用 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);
)
【讨论】:
以上是关于使用猫鼬的异步函数中的返回类型会产生错误的主要内容,如果未能解决你的问题,请参考以下文章
测试时出现“mpromise(猫鼬的默认承诺库)已弃用”错误[重复]