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

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

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

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

    答案:

    if 死循环等待

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

    比如回调,或者 Promise
    ytxbnahn
        11
    ytxbnahn  
       Mar 9, 2021
    async: false
    Jirajine
        12
    Jirajine  
       Mar 9, 2021 via Android
    你的请求是异步的,所以你的 verify()函数也得是异步的。
    可以用 async 、Promise,也可以用 callback 。
    ytxbnahn
        13
    ytxbnahn  
       Mar 9, 2021
    对不起 看错了
    justin2018
        14
    justin2018  
       Mar 9, 2021
    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
        15
    Vegetable  
       Mar 9, 2021
    问就是回调地狱啊
    sun2920989
        16
    sun2920989  
       Mar 9, 2021
    使用 async/await 的好时机.
    eason1874
        17
    eason1874  
       Mar 9, 2021
    赋值是有效的,但是 $.post 是异步的,没等响应 JS 就执行到下面的 return ret 了

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

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

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

    }
    }
    })
    }

    用的时候

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

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

    然后外面直接 .then()

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