繁体   English   中英

JS await 仅在异步函数中有效。 如何解决?

[英]JS await only valid in async function. How to resolve?

谁能告诉我我将一个函数定义为 async 但它仍然无法正常工作并抛出错误 我该如何解决这个问题?

 var courses = [ {ID: 1, Name: 'course 1', Author: 'Mariela Mckinney', Website: 'www.loarpharei.com'}, {ID: 2, Name: 'course 2', Author: 'Brylee Becker', Website: 'www.phattiodye.com'}, {ID: 3, Name: 'course 3', Author: 'Weston Edwards', Website: 'www.pretathlew.com'}, {ID: 4, Name: 'course 4', Author: 'Nathanael Fox', Website: 'www.senfredral.com'}, {ID: 5, Name: 'course 5', Author: 'Aarav Park', Website: 'www.ebreanerin.com'} ] async function get_course(ID){ return setTimeout(function(){ console.log('I am fired'); return get_index(ID); }, 2000); } let course_id = await get_course(2); console.log(course_id);

代码中有很多错误。 我希望片段对你有帮助。

 const courses = [ {id: 1, name: 'course 1', author: 'Mariela Mckinney', website: 'www.loarpharei.com'}, {id: 2, name: 'course 2', author: 'Brylee Becker', website: 'www.phattiodye.com'}, {id: 3, name: 'course 3', author: 'Weston Edwards', website: 'www.pretathlew.com'}, {id: 4, name: 'course 4', author: 'Nathanael Fox', website: 'www.senfredral.com'}, {id: 5, name: 'course 5', author: 'Aarav Park', website: 'www.ebreanerin.com'}, ] // The "async" keyword is actually redundant if there is no "await" keyword in // the function. async function getCourse(id) { return new Promise((resolve) => { setTimeout(() => { console.log('I am fired'); resolve(courses[id]); }, 2000); }); } async function main() { // You can always "await" an Async function, or a function returning a Promise. const course = await getCourse(2); console.log(course); } main(); // Notes: // 1. Always use camelCase for field names, function names and variable names. // 2. Most JavaScript developers prefer 2-space indent, instead of 4.

您不能在async函数之外使用await 这就是 API 的设计方式。 请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await 上的文档:

await 运算符用于等待 Promise。 它只能在异步函数中使用。

如果你想使用await你需要换行

let course_id = await get_course(2);

async函数中。

此外,正如 Daniel A. White 指出的那样, setTimeout不返回Promise ,而是返回一个计时器 ID,您可以稍后使用它来取消超时。

您可以使用 IIFE 将您的 await 调用包装在async函数中,但您还需要从其他函数返回承诺。

 var courses = [{ID: 1, Name: 'course 1', Author: 'Mariela Mckinney', Website: 'www.loarpharei.com'},{ID: 2, Name: 'course 2', Author: 'Brylee Becker', Website: 'www.phattiodye.com'},{ID: 3, Name: 'course 3', Author: 'Weston Edwards', Website: 'www.pretathlew.com'},{ID: 4, Name: 'course 4', Author: 'Nathanael Fox', Website: 'www.senfredral.com'},{ID: 5, Name: 'course 5', Author: 'Aarav Park', Website: 'www.ebreanerin.com'}] function get_course(ID) { console.log('I am fired.') return new Promise(resolve => { setTimeout(() => { resolve(courses) }, 2000) }) } (async() => { let course_id = await get_course(2); console.log(course_id); })()

setTimeout不返回承诺。 你必须将它包装在一个new Promise(...)调用中。 get_course(2)调用只是一个不在任何函数内部的自由/浮动调用,因此await在那里不起作用。

您应该将 setTimeout 包装到 Promise 中。 看例子:

 (async() => {var courses = [ {ID: 1, Name: 'course 1', Author: 'Mariela Mckinney', Website: 'www.loarpharei.com'}, {ID: 2, Name: 'course 2', Author: 'Brylee Becker', Website: 'www.phattiodye.com'}, {ID: 3, Name: 'course 3', Author: 'Weston Edwards', Website: 'www.pretathlew.com'}, {ID: 4, Name: 'course 4', Author: 'Nathanael Fox', Website: 'www.senfredral.com'}, {ID: 5, Name: 'course 5', Author: 'Aarav Park', Website: 'www.ebreanerin.com'} ] function get_index(id) { return courses.findIndex(i => i.ID === id); } function get_course(ID){ return new Promise(resolve => { setTimeout(function(){ console.log('I am fired'); resolve(get_index(ID)); }, 2000); }); } let course_id = await get_course(2); console.log(course_id); })();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM