You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:19:11