GJS中异步调用顺序执行问题及await语法错误排查
问题分析与解决方案
一、先解决你遇到的语法错误
你碰到的SyntaxError: missing ) after argument list,根源在foo函数里的Promise构造写法上。咱们看你原来的代码:
return new Promise((resolve, reject) async () => { ... })
这是典型的语法错误——Promise的executor参数是一个单独的函数,你不能把async关键字放在参数列表后面。正确的写法是把async直接标记在executor函数本身:
return new Promise(async (resolve, reject) => { ... })
修正这个括号位置的问题后,await this.foo2(par2)的语法就不会报错了。
二、修正后的完整代码(同时优化回调逻辑)
结合你的需求,我把两个函数都调整成符合Promise规范的写法,彻底摆脱全局变量的依赖:
foo(nick) { return new Promise(async (resolve, reject) => { async_foo(par, [], (c, res) => { let par2; try { par2 = c.somefun(res); } catch (e) { logError(e, `Some error`); // 这里一定要调用reject,不然Promise会一直处于pending状态 reject(e); return; } // 用await或者.then()都可以,这里用await更直观 try { const output = await this.foo2(par2); resolve(output); } catch (err) { reject(err); } }); }); } foo2(par2) { return new Promise((resolve, reject) => { // 把asyncfun的回调直接包装在Promise内部,不需要外部绑定回调 par2.asyncfun(null, (err, result) => { if (err) { reject(err); return; } // 这里根据你的业务逻辑,返回需要的结果就行 resolve(result); // 如果原来的callback需要处理par2,比如做一些转换,也可以在这里处理: // const processedResult = this.handlePar2Result(par2, result); // resolve(processedResult); }); }); }
三、比全局变量更好的回调返回值方案
全局变量确实是异步编程里的“坑”,很容易导致状态混乱,推荐两种更优的方式:
- 回调API Promise化:就像上面
foo2的写法,把所有回调风格的异步函数(比如async_foo、par2.asyncfun)都包装成Promise。这样你就能全程用async/await语法,代码逻辑线性化,完全不需要全局变量传递结果。这是现代JS异步编程的标准做法。 - Promise链式传递:如果不想用
async/await,可以通过.then()链式传递结果,比如在foo里写this.foo2(par2).then(output => resolve(output)),同样能避免全局变量。
另外提醒一句:在Promise的executor里,遇到错误一定要调用reject(),不然这个Promise会一直挂着,后续的await永远不会有结果。
内容的提问来源于stack exchange,提问作者Roberto Sánchez
相关产品推荐
相关产品推荐

