V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
RickyC
V2EX  ›  JavaScript

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

  •  
  •   RickyC · 264 天前 · 2410 次点击
    这是一个创建于 264 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    答案:

    if 死循环等待

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

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

    你可以你需要调用 verify() 结果的代码写成函数,在响应回调里调用。比如函数名 update_verify,update_verify(res.data.ret)
    chenluo0429
        18
    chenluo0429   264 天前 via Android
    1. promise 包装一层
    2. verify 接受一个 callback 函数作为参数,让 callback 来接收 ret
    RickyC
        19
    RickyC   263 天前
    @toma77 我想到的也是这个。不知道有什么优雅的方法吗
    eason1874
        20
    eason1874   263 天前
    @RickyC #19 优雅的方法就是回调啊,callback,很多人都说了。没必要用定时器
    muzuiget
        21
    muzuiget   263 天前
    楼上好几个人说了,要么 promise,要么 callback,楼主还是无视,基础知识不过关,没有异步的概念。
    Rhilip
        22
    Rhilip   263 天前
    async/await 最适合了,反正 jQuery 的 ajax 也是支持 await 的。
    zhengwenk
        23
    zhengwenk   263 天前   ❤️ 1
    既然用了异步就按异步的写法来啊,返回值又是同步的,这不是矛盾么。
    回旋标扔出去以后你手就空了。
    zhuweiyou
        24
    zhuweiyou   263 天前   ❤️ 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   263 天前
    24 是标答啊,大家一直在说 promise 和 async,后面又会引出 babel,webpack,cli,node,无穷无尽了
    mmlmml1
        26
    mmlmml1   263 天前
    jQuery 自带同步支持,真要同步的话可以直接 return $.post(...)
    mmlmml1
        27
    mmlmml1   263 天前
    参数里面带上 async: false 即可
    Building
        28
    Building   263 天前 via iPhone
    这种问题...有答的必要吗?
    zlu1123
        29
    zlu1123   263 天前
    使用回调啊,在 success 里面判断 callBack && callBack(res)
    Ice7173
        30
    Ice7173   263 天前
    在成功函数里做 callback,用 callback&&callback ( res ),或者 return 一个 promise,用.then()接参,这样就不会导致异步操作了,asnyc 其实也不好
    oott123
        31
    oott123   263 天前 via Android
    @imdong 这个场景下,死循环等待是没有用的。

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

    然后外面直接 .then()

    习惯异步
    Reapper
        37
    Reapper   263 天前
    不想用 async 同步到话,老办法只能 callback 一下啦,新方法就是 promise 啦!
    function verify(callback){
    $.post('','',function(){
    typeof callback === 'function' && callback()
    })
    }
    wednesdayco
        38
    wednesdayco   263 天前
    这题这题是刚学 JavaScript 么……父级这个词用的也蛮灵性……但这种的也还是更推荐 Promise 封装
    no1xsyzy
        39
    no1xsyzy   263 天前
    得理解 JavaScript 的纯异步思想
    一旦进入异步,你可以指望从现在开始 2000 年以后才会得到结果。
    PEAL
        40
    PEAL   263 天前
    函数增加 callback 参数啊
    jorneyr
        41
    jorneyr   263 天前
    回调函数或者 Promise 吧
    lemon6
        42
    lemon6   263 天前   ❤️ 1
    参考下 24 楼的回答
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2266 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 09:23 · PVG 17:23 · LAX 01:23 · JFK 04:23
    ♥ Do have faith in what you're doing.