为何.then()未等待async函数的Promise完成就执行?
问题原因分析
- async函数返回值逻辑错误:你的
async function A()内部没有返回异步操作的Promise实例。async函数如果没有显式返回值,会默认返回一个已resolve的Promise,其值为undefined,所以A().then()会立刻执行,直接拿到undefined。 - done回调的return无效:
jQuery.get().done()回调里的return只是该回调函数的返回值,和A函数的返回值完全无关,无法传递给A函数的调用者。 - jQuery.get的特性未利用:jQuery的
$.get返回的是一个兼容Promise规范的Deferred对象,你需要把这个对象作为A函数的返回值,才能让A()的then方法等待异步请求完成。
另外,原代码存在逻辑bug:result.indexOf("Example")的判断逻辑有误——indexOf找不到目标字符串时返回-1,找到时返回索引(可能为0),而if (0)会被判定为false,导致明明找到字符串却进入Fail分支,正确判断应为result.indexOf("Example") !== -1。
修正方案
方案1:返回jQuery.get的Promise并通过then处理结果
async function A(){ return jQuery.get("example.com").then(function(result){ if (result.indexOf("Example") !== -1){ console.log("success"); return 1; } else { console.log("Fail"); return -1; } }) } function B(){ A().then(function(result){ console.log("Res:" + result); }) } B();
方案2:用await等待异步请求完成(更贴合async/await语法)
async function A(){ const result = await jQuery.get("example.com"); if (result.indexOf("Example") !== -1){ console.log("success"); return 1; } else { console.log("Fail"); return -1; } } function B(){ A().then(function(result){ console.log("Res:" + result); }) } B();
两种方案都会让A().then()等待请求完成后再执行,输出顺序变为:
success Res:1
内容的提问来源于stack exchange,提问作者Gbr
相关产品推荐
相关产品推荐

