JS axios async/await 好像只能返回 promise - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
luffy

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

  •  
  •   luffy 2022 年 7 月 27 日 4668 次点击
    这是一个创建于 1367 天前的主题,其中的信息可能已经有所发展或是发生改变。
    async function hello() { return await Axios.request(options) } 

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

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

    一般怎么处理的?

    30 条回复    2023-03-25 11:05:39 +08:00
    zhuangzhuang1988
        1
    zhuangzhuang1988  
       2022 年 7 月 27 日
    没有办法。
    xiangyuecn
        2
    xiangyuecn  
       2022 年 7 月 27 日
    这娃没救了,不知道加 async
    AyaseEri
        3
    AyaseEri  
       2022 年 7 月 27 日
    调用函数里也 await 不就行了
    pagxir
        4
    pagxir  
       2022 年 7 月 27 日 via Android
    这是异步调用。你是没有办法在单线程的 nodejs 直接转成同步调用的。要么多线程,要么去 hack 到 nodejs ,要么就只能继续异步调用。当然了,你可以换其他同步调用的实现
    pendulum
        5
    a href="/member/pendulum" class="dark">pendulum  
       2022 年 7 月 27 日   1
    async 函数只能返回 promise
    elfive
        6
    elfive  
       2022 年 7 月 27 日 via iPhone
    async 修饰你调用这个函数的函数,同时调用语句前面加 await 关键字
    或者调用的地方用.then 也行呀……
    eason1874
        7
    eason1874  
       2022 年 7 月 27 日
    看样子你没理解 await ,你这样包一层再 let res = hello() 同样会拿到 promise

    你得在 async 里面 await 才能拿到返回值,比如

    async function hello() {
    let res = await Axios.request(options)
    // 这个 res 是同步返回值
    }

    要觉得调用 hello() 麻烦也可以把它写成立即执行的匿名函数
    jinliming2
        8
    jinliming2  
       2022 年 7 月 27 日
    JS 是单线程,Promise 只能由 Runtime 去后台执行然后安排回调。
    如果你硬要同步的话,由于单线程,在等待 IO 响应的时候,其他所有代码都没办法跑。
    cz5424
        9
    cz5424  
       2022 年 7 月 27 日
    直接去掉 async 不行吗?
    learningman
        10
    learningman  
       2022 年 7 月 27 日 via Android
    写个 spin lock ,强行把异步转成同步就好了捏
    aaronlam
        11
    aaronlam  
       2022 年 7 月 27 日
    await 后面的函数调用返回的就是 promise
    dumbass
        12
    dumbass  
       2022 年 7 月 27 日 via iPhone
    因为它只是语法,本质还是异步的
    yjd
        13
    yjd  
       2022 年 7 月 28 日
    var getData;
    (() => {
    (async () => {
    await Axios.request(options)
    .then(res => getData = res.data)
    })();
    return getData;
    })();
    DiamondYuan
        14
    DiamondYuan  
       2022 年 7 月 28 日   1
    有办法。 以下都前端黑魔法,不建议使用。 在某些特殊情况下有奇效。



    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
    })
    nowheremanx
        15
    nowheremanx  
       2022 年 7 月 28 日
    等 axios 调用完之后返回客户端不就好了,也就是 then 或者 await 。
    chnwillliu
        16
    chnwillliu  
       2022 年 7 月 28 日 via Android
    开一个 worker 然后 shared memory, 然后用 Atomics.wait 挂起等待 worker 完成请求。。。。
    geelaw
        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 的内容,并且返回值会失去类型这是因为它的原理是同步开一个新的进程执行代码。第二个方法里面是直接从源头杜绝异步。
    JounQin
        18
    JounQin  
       2022 年 7 月 28 日 via iPhone
    Node 端可以用这个 https://github.com/un-ts/synckit
    最近在考虑增加浏览器端端支持。
    JounQin
        19
    JounQin  
       2022 年 7 月 28 日 via iPhone
    node-force-sync 用的 child_process 完全不用考虑。
    fds
        20
    fds  
       2022 年 7 月 28 日
    ```
    async function hello() {
    let res = await Axios.request(options)
    将 res 发送给客户端
    }
    ```
    ming159
        21
    ming159  
       2022 年 7 月 28 日
    一堆人费劲心思提出了这么个 Promise 规范,解决异步带来的麻烦, 然后你要在这基础上硬生生的在退回原始方式....
    wangtian2020
        22
    wangtian2020  
       2022 年 7 月 28 日
    Javascript 异步函数 async function 重新学吧
    https://zh.Javascript.info/async-await

    promise 是回调地狱的优雅解决方法
    AV1
        23
    AV1  
       2022 年 7 月 28 日
    const result = await hello();
    response.end(result);
    yunyuyuan
        24
    yunyuyuan  
       2022 年 7 月 28 日
    nothingistrue
        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 下那么你就是在主线程中,这时候是不允许阻塞的。
    jspatrick
        26
    jspatrick  
       2022 年 7 月 28 日
    async 具有传染性,这是他的优点,也是他的缺点
    DingJZ
        27
    DingJZ  
       2022 年 7 月 28 日
    顺着这看了一下 node-force-sync 的实现,真有想法啊,鬼才
    chnwillliu
        28
    chnwillliu  
       2022 年 7 月 28 日 via Android
    @nothingistrue js 也有的,不过不是线程,是 worker ,更像是进程就是了,而且没法直接共享内存,要借助 shared buffer, 但也是可以以阻塞模式 wait 对方,等对方 notify 再继续跑的。也就是借助 Atomics 相关的 API 。一些库可以利用这个把复杂异步操作封装进另一个 worker ,对外呈现同步阻塞的调用方式,很有意思。
    amlee
        29
    amlee  
       2022 年 7 月 28 日
    hello().then(result => console.log(result))
    ScottHU
        30
    ScottHU  
       2023 年 3 月 25 日
    不行,async 函数里不管返回什么东西,调用的地方永远只能接收到 promise ,如果你觉得这样麻烦或不直观,可以尝试一下和 react 、vue 等 UI 框架深度融合的请求库,可以解决你这个问题,推荐给你使用 alova ,api 设计和 axios 很相似
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1617 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 80ms UTC 16:30 PVG 00:30 LAX 09:30 JFK 12:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86