推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
RickyC

js 的回调如何给父级赋值?

  •  
  •   RickyC · Mar 9, 2021 · 5192 views
    This topic created in 2064 days ago, the information mentioned may be changed or developed.

    如

    function verify(){
        var ret = false
        
        $.post('api.php',
        	{code: 222},
            
        	function(res){
        	   if(res.code === 200){
                
                    //这样赋值是无效的
                	ret = res.data.ret
                }
        	}
        })
    	return ret
      }
    

    众所周知 jQuery 已经弃用了 async 参数,所以怎么搞?

    42 replies  •  2021-03-10 11:45:24 +08:00
    chenluo0429
    chenluo0429
    Mar 9, 2021 via Android❤️1
    1
    赋值显然是有效的,只是你 return 时,ret 还没有被赋值
    foolenius
    foolenius
    Mar 9, 2021
    2
    请求是异步操作,异步还没触发回调就直接返回了
    kaiki
    kaiki
    Mar 9, 2021
    3
    ajax 是异步的,你应该把 return 写在赋值后
    你多加点 console.log 调试下就知道了
    ayase252
    ayase252
    Mar 9, 2021 via iPhone
    4
    return promise
    外面 .then
    RickyC
    RickyC
    OP
    Mar 9, 2021
    5
    @kaiki 赋值是在回调里的,
    回调里不能给父级 return 吧?
    RickyC
    RickyC
    OP
    Mar 9, 2021
    6
    @chenluo0429 对呀,怎么解决
    toma77
    toma77
    Mar 9, 2021 via iPhone
    7
    setTimeout 包一下 return
    sannyzeng
    sannyzeng
    Mar 9, 2021
    8
    用 4 楼的方法,没问题啊
    wangxiaoaer
    wangxiaoaer
    Mar 9, 2021
    9
    一句话,现在的 verify 是同步函数里面调用了异步方法,所以得不到内部异步的处理结果。

    解决办法是:verify 增加一个 callback 参数,内部的异步过程完成再触发这个 callback
    imdong
    imdong
    Mar 9, 2021
    10
    想起来前几天群里聊到的面试题,类似的情况说不添加新的 fun 的情况下如何实现返回;

    答案:

    if 死循环等待

    很傻,但这样的构架只能这么搞,除非你能改变外面的调用方式

    比如回调,或者 Promise
    ytxbnahn
    ytxbnahn
    Mar 9, 2021
    11
    async: false
    Jirajine
    Jirajine
    Mar 9, 2021 via Android
    12
    你的请求是异步的,所以你的 verify()函数也得是异步的。
    可以用 async 、Promise,也可以用 callback 。
    ytxbnahn
    ytxbnahn
    Mar 9, 2021
    13
    对不起 看错了
    justin2018
    justin2018
    Mar 9, 2021
    14
    javascript - How do I return the response from an asynchronous call? - Stack Overflow
    https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call
    Vegetable
    Vegetable
    Mar 9, 2021
    15
    问就是回调地狱啊
    ohmycodeape
    ohmycodeape
    Mar 9, 2021
    16
    使用 async/await 的好时机.
    eason1874
    eason1874
    Mar 9, 2021
    17
    赋值是有效的,但是 $.post 是异步的,没等响应 JS 就执行到下面的 return ret 了

    你可以你需要调用 verify() 结果的代码写成函数,在响应回调里调用。比如函数名 update_verify,update_verify(res.data.ret)
    chenluo0429
    chenluo0429
    Mar 9, 2021 via Android
    18
    1. promise 包装一层
    2. verify 接受一个 callback 函数作为参数,让 callback 来接收 ret
    RickyC
    RickyC
    OP
    Mar 9, 2021
    19
    @toma77 我想到的也是这个。不知道有什么优雅的方法吗
    eason1874
    eason1874
    Mar 9, 2021
    20
    @RickyC #19 优雅的方法就是回调啊,callback,很多人都说了。没必要用定时器
    muzuiget
    muzuiget
    Mar 9, 2021
    21
    楼上好几个人说了,要么 promise,要么 callback,楼主还是无视,基础知识不过关,没有异步的概念。
    Rhilip
    Rhilip
    Mar 9, 2021
    22
    async/await 最适合了,反正 jQuery 的 ajax 也是支持 await 的。
    zhengwenk
    zhengwenk
    Mar 9, 2021❤️1
    23
    既然用了异步就按异步的写法来啊,返回值又是同步的,这不是矛盾么。
    回旋标扔出去以后你手就空了。
    zhuweiyou
    zhuweiyou
    Mar 9, 2021❤️2
    24
    function verify( callback ){

    $.post('api.php',
    {code: 222},

    function(res){
    if(res.code === 200){
    callback( res.data.ret )

    }
    }
    })
    }

    用的时候

    verify(ret => {
    console.log(ret)
    })
    wgbx
    wgbx
    Mar 9, 2021
    25
    24 是标答啊,大家一直在说 promise 和 async,后面又会引出 babel,webpack,cli,node,无穷无尽了
    mmlmml1
    mmlmml1
    Mar 9, 2021
    26
    jQuery 自带同步支持,真要同步的话可以直接 return $.post(...)
    mmlmml1
    mmlmml1
    Mar 9, 2021
    27
    参数里面带上 async: false 即可
    Building
    Building
    Mar 9, 2021 via iPhone
    28
    这种问题...有答的必要吗?
    zlu1123
    zlu1123
    Mar 9, 2021
    29
    使用回调啊,在 success 里面判断 callBack && callBack(res)
    Ice7173
    Ice7173
    Mar 9, 2021
    30
    在成功函数里做 callback,用 callback&&callback ( res ),或者 return 一个 promise,用.then()接参,这样就不会导致异步操作了,asnyc 其实也不好
    oott123
    oott123
    Mar 9, 2021 via Android
    31
    @imdong 这个场景下,死循环等待是没有用的。

    单线程模型下,死循环会导致回调永远得不到执行。
    autoxbc
    autoxbc
    Mar 9, 2021
    32
    @wgbx #25 时代变了,promise 和 async 已经是原生特性,和后面那些完全不同
    en20
    en20
    Mar 9, 2021❤️4
    33
    @Building 大家都是从新手过来的,如果当初能有人帮助我真的会很感激.
    Shook
    Shook
    Mar 9, 2021
    34
    1. async/await
    2. callback
    rencoo
    rencoo
    Mar 9, 2021
    35
    $.post('api.php', {code: 222})
    .success((data) => {
    // 在这里赋值
    });
    meepo3927
    meepo3927
    Mar 10, 2021
    36
    函数里直接 return $.post(...)

    然后外面直接 .then()

    习惯异步
    Reapper
    Reapper
    Mar 10, 2021
    37
    不想用 async 同步到话,老办法只能 callback 一下啦,新方法就是 promise 啦!
    function verify(callback){
    $.post('','',function(){
    typeof callback === 'function' && callback()
    })
    }
    wednesdayco
    wednesdayco
    Mar 10, 2021
    38
    这题这题是刚学 JavaScript 么……父级这个词用的也蛮灵性……但这种的也还是更推荐 Promise 封装
    no1xsyzy
    no1xsyzy
    Mar 10, 2021
    39
    得理解 JavaScript 的纯异步思想
    一旦进入异步,你可以指望从现在开始 2000 年以后才会得到结果。
    PEAL
    PEAL
    Mar 10, 2021
    40
    函数增加 callback 参数啊
    jorneyr
    jorneyr
    Mar 10, 2021
    41
    回调函数或者 Promise 吧
    lemon6
    lemon6
    Mar 10, 2021❤️1
    42
    参考下 24 楼的回答
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5057 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 103ms · UTC 05:58 · PVG 13:58 · LAX 21:58 · JFK 00:58
    ♥ Do have faith in what you're doing.