为什么我的async异步函数返回undefined且执行顺序不符合预期?
问题原因分析
- 函数返回undefined的核心原因
你的test1函数没有显式写return语句。then回调里的return只是将用户ID返回赋值给了内部的fetchPromise变量,但整个async函数没有把这个值向外返回,async函数无return时默认返回值为undefined的Promise对象。
另外判断逻辑里你写的是await test1,没有加()调用函数,这里await的是函数对象本身,不是函数执行返回的Promise,自然不可能和字符串"43000480694"相等,所以直接输出NO。 - 输出顺序不符的原因
JS基于单线程事件循环模型运行,异步任务会等待所有同步代码执行完成后才会执行:
- 同步执行if判断时,
await test1拿到的是函数对象,和字符串比对失败,直接同步输出NO - 同步执行
test1()调用,async函数执行到await的fetch语句前会立刻返回Pending状态的Promise,所以控制台此时打印出Promise - 所有同步代码执行完成后,fetch异步请求拿到响应,才会执行后续的then链逻辑打印用户ID,所以最后才输出
43000480694
修正代码
async/await是Promise的语法糖,不需要和then混用,拆分写await可读性更高:
async function test1() { const response = await fetch("https://www.instagram.com/boarirkeerd/?__a=1", {}) const jsonData = await response.json() const userId = jsonData.graphql.user.id console.log(userId) return userId // 显式向外返回用户ID }; // await只能在async函数内部使用,全局环境可以用自执行async函数包裹 (async () => { if (await test1() === "43000480694") { // 加()执行test1函数 console.log("YES") } else { console.log('NO') } test1() })()
内容的提问来源于stack exchange,提问作者Stefan Dacey
相关产品推荐
相关产品推荐

