我有一些诺言
getSomeInfo(data) {
return new Promise((resolve, reject) => {
/* ...some code... */
someObject.getData((err, info) => {
if (info) {
resolve(info)
}
else {
reject("Error")
}
})
})
}
我使用了这个承诺,并希望从Controller(AdonisJS)向客户端发送响应:
async create ({ request, response }) {
this.getSomeInfo(data).then(info => {
console.log(info) // It's work, i get the data from promise
response.status(201).json({ // but this is not work
code: 201,
message: "Data received!",
data: info
})
})
}
为什么响应不起作用?
答案 0 :(得分:1)
只需这样做。
async create ({ request, response }) {
const info = await this.getSomeInfo(data)
console.log(info)
response.status(201).json({
code: 201,
message: "Data received!",
data: info
})
}
答案 1 :(得分:0)
如果console.log(info)
中的create()
可以正常工作并显示所需的数据,但是response.status(201).json(...)
没有发送响应,那么我可以看到以下可能性:
.json()
方法无法将info
转换为JSON(可能是由于循环引用),并且引发异常。request
和response
,因此response
不是应该的。您可以像这样测试第二种情况:
create ({ request, response }) {
this.getSomeInfo(data).then(info => {
console.log(info) // It's work, i get the data from promise
response.status(201).json({ // but this is not work
code: 201,
message: "Data received!",
data: info
});
}).catch(e => {
console.log("Error in create()", e);
response.sendStatus(500);
});
}
此外,没有理由将此方法声明为async
,因为您没有显示正在使用await
或async
函数的任何功能。
在注释中,您说此功能直接由路由器(我假设为Express路由器)调用。如果真是这样,那么函数参数就不能正确地声明,因为它们是作为两个单独的参数而不是作为对象的属性出现的。将函数声明更改为此:
create (request, response) { ... }
答案 2 :(得分:0)
将一个函数标记为async
时,该函数必须返回一个Promise
,这可以显式完成。
async create({ request, response }) {
return this.getSomeInfo(data).then(info => {
console.log(info) // It's work, i get the data from promise
response.status(201).json({ // but this is not work
code: 201,
message: "Data received!",
data: info
})
})
}
或隐式使用await
关键字。
async create({ request, response }) {
const info = await this.getSomeInfo(data)
console.log(info) // It's work, i get the data from promise
response.status(201).json({ // but this is not work
code: 201,
message: "Data received!",
data: info
})
}