如何在Node.js的async函数外部获取Promise返回值?
解决异步函数外部获取返回值为undefined的问题
我来帮你把这个问题捋清楚!你遇到的情况其实是异步代码执行顺序的典型问题,咱们一步步来拆解:
为什么你的代码里subscription会是undefined?
getSub()是一个异步函数,当你调用它的时候,JavaScript并不会停下来等它里面的await stripe.subscriptions.retrieve执行完成,而是会继续往下跑console.log这行代码。这时候异步请求还在后台处理,subscription变量还没被赋值,自然就是初始的undefined啦。
正确的写法有这几种:
1. 用await调用异步函数(需包裹在异步环境中)
因为await只能在异步函数里使用,所以我们可以用立即执行函数表达式(IIFE)来创建一个异步环境:
let subscription; async function getSub(){ return await stripe.subscriptions.retrieve('sub_HurxwcQoCIH7jv'); } // 用IIFE包裹异步逻辑 (async () => { subscription = await getSub(); console.log("subscription: ", subscription); // 这里就能拿到正确的值了 })();
2. 用.then()处理Promise返回值
异步函数本身会返回一个Promise,所以我们可以直接用.then()来接收异步操作完成后的结果:
let subscription; async function getSub(){ return await stripe.subscriptions.retrieve('sub_HurxwcQoCIH7jv'); } getSub().then(sub => { subscription = sub; console.log("subscription: ", subscription); });
3. 简化getSub函数
其实async函数里如果直接返回一个Promise,await可以省略,因为async函数会自动把返回值包装成Promise:
let subscription; // 简化后的getSub function getSub(){ return stripe.subscriptions.retrieve('sub_HurxwcQoCIH7jv'); } // 同样用IIFE或者.then()处理 (async () => { subscription = await getSub(); console.log("subscription: ", subscription); })();
核心记住一句话:异步操作的结果只能在异步操作完成后才能访问,不能在调用异步函数后立即同步去获取结果哦!
内容的提问来源于stack exchange,提问作者quietplace
相关产品推荐
相关产品推荐

