问询这段JavaScript代码中async/await的运行逻辑及Promise的onSuccess作用
1. async函数内await的运行逻辑
你代码里的await file_namePromise会触发以下执行流程:
- 执行到await语句时,
playWordsAudio函数会暂停后续代码的执行,同时让出JS主线程执行其他同步任务,直到file_namePromise的状态从等待(pending)变更为兑现(fulfilled)或拒绝(rejected) - 当
file_namePromise兑现后,函数恢复执行,Promise的兑现值会被赋值给resultant变量
2. await得到的resultant会不会直接返回给调用方
不会,所有async函数的返回值永远是Promise对象,不会直接返回普通值:
- 你在async函数内通过
return返回的resultant,会自动作为async函数返回的Promise的兑现值 - 你调用
playWordsAudio(id, type, true)拿到的result本身就是Promise实例,所以你需要通过.then()回调才能拿到内部return的resultant值,这部分你的实现逻辑是正确的
3. Promise中onSuccess方法的作用
你创建file_namePromise时传入的onSuccess是这个Promise的兑现触发器:
- 只有你主动调用
onSuccess(参数)时,才会把file_namePromise的状态从pending修改为fulfilled,传入的参数就是这个Promise的兑现值,也就是await最终拿到的resultant的值 - 注意你当前代码的逻辑:只有当
check=true时才会调用onSuccess,如果check=false,你直接执行音频播放逻辑但没有调用onSuccess,此时file_namePromise会永远卡在pending状态,await后的代码永远不会执行
4. 注释return语句后Promise看似未兑现的原因
你注释的if(check){return resultant;}是async函数给外层返回兑现值的逻辑:
- 如果去掉这段return,async函数执行完后会默认返回
undefined,你在modify_object的.then()回调中拿到的value就是undefined,自然无法命中value == "Not Found"的判断逻辑,看起来就像Promise没有兑现 - 额外代码优化提示:当前代码没有处理XHR请求异常的场景,比如网络错误、接口返回4xx/5xx状态码时,你没有调用
onFailure触发Promise拒绝,会导致file_namePromise永远卡在pending状态,可能引发内存泄漏;同时代码中的file_name、audio变量没有加let/const声明,会污染全局作用域,建议补充声明。
内容的提问来源于stack exchange,提问作者Joy Ram Sen Gupta
相关产品推荐
相关产品推荐

