JS axios async/await 好像只能返回 promise

2022-07-27 19:57:53 +08:00
 luffy
async function hello() {
  return await Axios.request(options)
}

有办法返回最终值嘛? 而不是返回一个 promise

如果是在服务端,比如 nodejs 里面,如果想要返回一个 axios request 后的值给客户端

一般怎么处理的?

4271 次点击
所在节点    程序员
30 条回复
ming159
2022-07-28 08:25:57 +08:00
一堆人费劲心思提出了这么个 Promise 规范,解决异步带来的麻烦, 然后你要在这基础上硬生生的在退回原始方式....
wangtian2020
2022-07-28 08:35:05 +08:00
JavaScript 异步函数 async function 重新学吧
https://zh.javascript.info/async-await

promise 是回调地狱的优雅解决方法
DOLLOR
2022-07-28 09:11:02 +08:00
const result = await hello();
response.end(result);
yunyuyuan
2022-07-28 09:27:52 +08:00
nothingistrue
2022-07-28 09:34:29 +08:00
同步方法才能直接返回最终值,异步方法只能返回 promise 或者类似机制,你要想让异步方法产生返回最终值的效果,那就要使用“异步回同步”处理(起的名字可能不对)。

这个“异步回同步”处理,对于多线程语言或者允许当前线程阻塞的环境来说,可以给 promise 设计个带 wait/await 的方法,调用它就能立刻(在当前线程)同步阻塞的等待返回值,例如 Java 的 java.util.concurrent.Future#get() 。而在 async/await 设计理念下,你可以通过 await 调用异步方法来获取返回值,就是你代码里面的 return await Axios.request(options) ,但是这个调用必须是在 async 下的,因为要不是在 async 下那么你就是在主线程中,这时候是不允许阻塞的。
jspatrick
2022-07-28 16:25:47 +08:00
async 具有传染性,这是他的优点,也是他的缺点
DingJZ
2022-07-28 17:36:10 +08:00
顺着这看了一下 node-force-sync 的实现,真有想法啊,鬼才
chnwillliu
2022-07-28 20:21:18 +08:00
@nothingistrue js 也有的,不过不是线程,是 worker ,更像是进程就是了,而且没法直接共享内存,要借助 shared buffer, 但也是可以以阻塞模式 wait 对方,等对方 notify 再继续跑的。也就是借助 Atomics 相关的 API 。一些库可以利用这个把复杂异步操作封装进另一个 worker ,对外呈现同步阻塞的调用方式,很有意思。
amlee
2022-07-28 22:39:45 +08:00
hello().then(result => console.log(result))
ScottHU
2023-03-25 11:05:39 +08:00
不行,async 函数里不管返回什么东西,调用的地方永远只能接收到 promise ,如果你觉得这样麻烦或不直观,可以尝试一下和 react 、vue 等 UI 框架深度融合的请求库,可以解决你这个问题,推荐给你使用 alova ,api 设计和 axios 很相似

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/869082

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX