JavaScript异步阻塞请求:从async函数获取返回值的实现疑问
从Async函数获取返回值的正确实现方法
我来帮你梳理下怎么优雅地从async函数里拿到返回值~你现在用全局变量res接收结果的方式虽然能跑,但并不是最佳实践,其实async函数本身就会返回一个Promise,咱们可以直接利用这个特性来规范实现,完全不需要依赖全局变量。
修改后的完整代码示例
function publish() { return new Promise(function (resolve, reject) { setTimeout(function () { resolve("SUCCESS"); }, 3000); }); } // 优化后的sendRequest:返回异步操作的结果 async function sendRequest() { console.log("START\n"); const res = await publish(); // 用局部变量替代全局变量,避免变量污染 console.log("RESULT: ", res); console.log("END\n"); return res; // 将结果返回,async函数会自动把这个值包装成Promise返回 } // 方式1:在非async环境中用.then()获取返回值 sendRequest().then(result => { console.log("从async函数拿到的返回值:", result); // 输出:从async函数拿到的返回值:SUCCESS }); // 方式2:在另一个async函数里用await获取(更贴合async/await的同步化写法) async function main() { const result = await sendRequest(); console.log("从async函数拿到的返回值:", result); } main();
关键细节说明
- async函数的核心特性:所有async函数执行后都会返回一个Promise。当函数内部的
await完成异步操作后,这个Promise会自动resolve为你return的值;如果函数抛出错误,Promise则会reject对应的错误信息。 - 为什么不用全局变量:全局变量容易造成作用域污染,在复杂的异步场景下还可能引发竞态问题(比如多个异步操作同时修改全局变量),用局部变量+Promise返回的方式更安全、代码也更易维护。
- 两种取值场景的适配:
- 如果是在普通同步代码里,用
.then()链式调用处理返回的Promise即可; - 如果本身就在async函数环境中,直接用
await接收返回值,写法更像同步代码,可读性拉满。
- 如果是在普通同步代码里,用
最终运行结果
不管用哪种方式,最终都会输出:
START RESULT: SUCCESS END 从async函数拿到的返回值: SUCCESS
内容的提问来源于stack exchange,提问作者Kiren S
相关产品推荐
相关产品推荐

