我在Sequelize.js的节点8上
尝试使用await
时出现以下错误。
SyntaxError: await is only valid in async function
代码:
async function addEvent(req, callback) {
var db = req.app.get('db');
var event = req.body.event
db.App.findOne({
where: {
owner_id: req.user_id,
}
}).then((app) => {
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("done!"), 6000)
})
// I get an error at this point
let result = await promise;
// let result = await promise;
// ^^^^^
// SyntaxError: await is only valid in async function
}
})
}
出现以下错误:
let result = await promise;
^^^^^
SyntaxError: await is only valid in async function
我在做什么错了?
答案 0 :(得分:5)
您只能在异步功能下运行await语句。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
所以,你可以写你的
var viewModel = new StoryDetailsViewModelAnonymousUser
{
StoryId = FoundStory.Id,
AuthorId = FoundStory.AuthorId,
Story = FoundStory,
Comments = _dbContext.Comments.Where(x => x.StoryId == FoundStory.Id).ToList()
};
if (signedInUserId != null)
{
viewModel.User = _dbContext.Users.SingleOrDefault(x => x.Id == signedInUserId);
}
return View(viewModel);
为
}).then((app) => {
答案 1 :(得分:2)
async/await
仅在立即函数具有async关键字的情况下有效,您需要这样做:
...
}).then(async app => { // <<<< here
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("done!"), 6000)
})
// I get an error at this point
let result = await promise;
// let result = await promise;
// ^^^^^
// SyntaxError: await is only valid in async function
}
})
答案 2 :(得分:2)
addEvent
是async..await
和原始承诺的混合。 await
是then
的语法糖。是一个或另一个。混合会导致错误的控制流; db.App.findOne(...).then(...)
的诺言未链接或返回,因此无法从外部addEvent
获得。
应该是:
async function addEvent(req, callback) {
var db = req.app.get('db');
var event = req.body.event
const app = await db.App.findOne({
where: {
owner_id: req.user_id,
}
});
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("done!"), 6000)
})
let result = await promise;
}
通常,普通回调不应与promise混合使用。 callback
参数表示使用addEvent
的API可能也需要被告知。
答案 3 :(得分:0)
您只能在异步函数内使用await。您也只能等待一段返回承诺的代码。
这里您在不同的上下文中使用await。最好在这里使用then()解决问题。
await仅在包含它的立即函数是异步的情况下有效。