
async function hello() { return await Axios.request(options) } 有办法返回最终值嘛? 而不是返回一个 promise
如果是在服务端,比如 nodejs 里面,如果想要返回一个 axios request 后的值给客户端
一般怎么处理的?
1 zhuangzhuang1988 2022 年 7 月 27 日 没有办法。 |
2 xiangyuecn 2022 年 7 月 27 日 这娃没救了,不知道加 async |
3 AyaseEri 2022 年 7 月 27 日 调用函数里也 await 不就行了 |
4 pagxir 2022 年 7 月 27 日 via Android 这是异步调用。你是没有办法在单线程的 nodejs 直接转成同步调用的。要么多线程,要么去 hack 到 nodejs ,要么就只能继续异步调用。当然了,你可以换其他同步调用的实现 |
5 a href="/member/pendulum" class="dark">pendulum 2022 年 7 月 27 日 async 函数只能返回 promise |
6 elfive 2022 年 7 月 27 日 via iPhone async 修饰你调用这个函数的函数,同时调用语句前面加 await 关键字 或者调用的地方用.then 也行呀…… |
7 eason1874 2022 年 7 月 27 日 看样子你没理解 await ,你这样包一层再 let res = hello() 同样会拿到 promise 你得在 async 里面 await 才能拿到返回值,比如 async function hello() { let res = await Axios.request(options) // 这个 res 是同步返回值 } 要觉得调用 hello() 麻烦也可以把它写成立即执行的匿名函数 |
8 jinliming2 2022 年 7 月 27 日 JS 是单线程,Promise 只能由 Runtime 去后台执行然后安排回调。 如果你硬要同步的话,由于单线程,在等待 IO 响应的时候,其他所有代码都没办法跑。 |
9 cz5424 2022 年 7 月 27 日 直接去掉 async 不行吗? |
10 learningman 2022 年 7 月 27 日 via Android 写个 spin lock ,强行把异步转成同步就好了捏 |
11 aaronlam 2022 年 7 月 27 日 await 后面的函数调用返回的就是 promise |
12 dumbass 2022 年 7 月 27 日 via iPhone 因为它只是语法,本质还是异步的 |
13 yjd 2022 年 7 月 28 日 var getData; (() => { (async () => { await Axios.request(options) .then(res => getData = res.data) })(); return getData; })(); |
14 DiamondYuan 2022 年 7 月 28 日 有办法。 以下都前端黑魔法,不建议使用。 在某些特殊情况下有奇效。 1. 在 nodejs 里可以使用 node-force-sync const { forceSync } = require('node-force-sync'); const asyncGet = async (url: string) => { const axios = require('axios'); return (await axios.get(url)).data; }; const syncGet = forceSync(asyncGet); const respOnse= syncGet('https://postman-echo.com/get?foo=bar'); 2. 在浏览器里可以使用 $.ajax({ type: "GET", url: remote_url, async: false }) |
15 nowheremanx 2022 年 7 月 28 日 等 axios 调用完之后返回客户端不就好了,也就是 then 或者 await 。 |
16 chnwillliu 2022 年 7 月 28 日 via Android 开一个 worker 然后 shared memory, 然后用 Atomics.wait 挂起等待 worker 完成请求。。。。 |
17 geelaw 2022 年 7 月 28 日 这个问题和 axios 没有任何关系,Javascript 不允许同步化异步操作,而且只要 Javascript 维持单线程模型和 setTimeout 的语义,很难预见同步化异步操作的可能性。 考虑如下代码: var Axios = {}; Axios.request = function (options) { return new Promise(function (resolve, reject) { setTimeout(function () { console.log(2); resolve(3); }, 1000); }); }; 考虑强行同步 var mySync = function (options) { return magic syncronous result of Axios.request(options); }; 那么代码 var excl = mySync(); console.log(1); console.log(excl); 有矛盾。 一方面,根据 Promise 和 setTimeout 的要求,2 必须在 1 之后( Promise 构造器传入的方法立刻执行,因此 setTimeout 发生在 1 之前,同时 setTimeout 在延迟是 1000 的时候保证传入的方法在当前同步代码块结束后才调用)。另一方面,如果要求 excl 得到 3 的值,那么必须先经过 2 ,但 excl 的值在 1 之前得到。 @DiamondYuan #14 应该注意 node-force-async 得到的结果是错误的例如传入的方法必须不读取外 scope 的内容,并且返回值会失去类型这是因为它的原理是同步开一个新的进程执行代码。第二个方法里面是直接从源头杜绝异步。 |
18 JounQin 2022 年 7 月 28 日 via iPhone Node 端可以用这个 https://github.com/un-ts/synckit 最近在考虑增加浏览器端端支持。 |
19 JounQin 2022 年 7 月 28 日 via iPhone node-force-sync 用的 child_process 完全不用考虑。 |
20 fds 2022 年 7 月 28 日 ``` async function hello() { let res = await Axios.request(options) 将 res 发送给客户端 } ``` |
21 ming159 2022 年 7 月 28 日 一堆人费劲心思提出了这么个 Promise 规范,解决异步带来的麻烦, 然后你要在这基础上硬生生的在退回原始方式.... |
22 wangtian2020 2022 年 7 月 28 日 |
23 AV1 2022 年 7 月 28 日 const result = await hello(); response.end(result); |
24 yunyuyuan 2022 年 7 月 28 日 1. await hello(); 2. https://www.google.com/search?q=nodejs+synchronous+http+request |
25 nothingistrue 2022 年 7 月 28 日 同步方法才能直接返回最终值,异步方法只能返回 promise 或者类似机制,你要想让异步方法产生返回最终值的效果,那就要使用“异步回同步”处理(起的名字可能不对)。 这个“异步回同步”处理,对于多线程语言或者允许当前线程阻塞的环境来说,可以给 promise 设计个带 wait/await 的方法,调用它就能立刻(在当前线程)同步阻塞的等待返回值,例如 Java 的 java.util.concurrent.Future#get() 。而在 async/await 设计理念下,你可以通过 await 调用异步方法来获取返回值,就是你代码里面的 return await Axios.request(options) ,但是这个调用必须是在 async 下的,因为要不是在 async 下那么你就是在主线程中,这时候是不允许阻塞的。 |
26 jspatrick 2022 年 7 月 28 日 async 具有传染性,这是他的优点,也是他的缺点 |
27 DingJZ 2022 年 7 月 28 日 顺着这看了一下 node-force-sync 的实现,真有想法啊,鬼才 |
28 chnwillliu 2022 年 7 月 28 日 via Android @nothingistrue js 也有的,不过不是线程,是 worker ,更像是进程就是了,而且没法直接共享内存,要借助 shared buffer, 但也是可以以阻塞模式 wait 对方,等对方 notify 再继续跑的。也就是借助 Atomics 相关的 API 。一些库可以利用这个把复杂异步操作封装进另一个 worker ,对外呈现同步阻塞的调用方式,很有意思。 |
29 amlee 2022 年 7 月 28 日 hello().then(result => console.log(result)) |
30 ScottHU 2023 年 3 月 25 日 不行,async 函数里不管返回什么东西,调用的地方永远只能接收到 promise ,如果你觉得这样麻烦或不直观,可以尝试一下和 react 、vue 等 UI 框架深度融合的请求库,可以解决你这个问题,推荐给你使用 alova ,api 设计和 axios 很相似 |