在Promise.then中使用async/await报错及顺序执行Promise需求
问题分析与解决方案
咱们来拆解你遇到的两个核心问题:语法错误和Promise顺序执行的需求,一步步解决它们。
1. 为什么会出现Parsing Error: Unexpected Token t2?
这个错误的根源很明确:
- 你在
.then(res => { ... })这个普通回调函数里写了await t2(r),但这个回调没有被标记为async,JavaScript引擎无法识别await关键字,直接抛出语法错误。 - 另外你的
t2函数还有个小bug:.then()的参数必须是函数,而不是对象(then({ //do something })这种写法是无效的),这也会导致后续执行异常。
2. 如何实现Promise顺序执行?
你想要先完成t2(res[0])再执行t2(res[1])的串行需求,用async/await配合普通循环是最直观且易读的方案,比嵌套Promise链式调用更清晰。
修复后的完整代码
// 先修复t2函数:.then()要传函数,不是对象 function t2(event) { return Promise.resolve() .then(() => { // 这里写你的第一个处理逻辑 console.log(`开始处理event: ${event}`); }) .then(() => { // 这里写后续的链式处理逻辑 // 记得返回最终结果,不然t2的Promise会默认返回undefined return `处理完成: ${event}`; }); } // 修复t1函数,实现顺序执行 async function t1() { const arr1 = [1,2,3,4,5]; const results = []; // 用await替代.then()获取DB查询结果,代码更简洁 const res = await db.query(query).execute(); // 用for...of循环配合await,确保每个t2串行执行 for (const r of res) { const processedResult = await t2(r); results.push(processedResult); } return results; } // 调用t1并处理最终结果 t1() .then(finalResults => { console.log("最终顺序执行结果:", finalResults); }) .catch(err => { console.error("执行出错:", err); });
可选方案:用Bluebird的Promise.map实现串行
如果你的项目中使用了Bluebird库(它扩展了原生Promise的功能),也可以用Promise.map并设置concurrency: 1来实现串行,代码更紧凑:
const Promise = require('bluebird'); // 确保已安装并引入Bluebird async function t1() { const res = await db.query(query).execute(); // concurrency:1 强制串行执行每个t2调用 const results = await Promise.map(res, async r => { return await t2(r); }, { concurrency: 1 }); return results; }
关键知识点总结
await只能在async标记的函数内部使用,普通函数里用会直接报语法错误。- 实现Promise串行执行,最直观的方式是
for...of+await,避免回调嵌套,代码可读性更高。 .then()方法必须接收函数作为参数,传递对象是无效写法。
内容的提问来源于stack exchange,提问作者user3807691
相关产品推荐
相关产品推荐

