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

2021-03-09 17:02:02 +08:00
 RickyC

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

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

3573 次点击
所在节点    JavaScript
42 条回复
chenluo0429
2021-03-09 17:04:17 +08:00
赋值显然是有效的,只是你 return 时,ret 还没有被赋值
foolnius
2021-03-09 17:06:27 +08:00
请求是异步操作,异步还没触发回调就直接返回了
kaiki
2021-03-09 17:08:44 +08:00
ajax 是异步的,你应该把 return 写在赋值后
你多加点 console.log 调试下就知道了
ayase252
2021-03-09 17:09:42 +08:00
return promise
外面 .then
RickyC
2021-03-09 17:10:07 +08:00
@kaiki 赋值是在回调里的,
回调里不能给父级 return 吧?
RickyC
2021-03-09 17:10:47 +08:00
@chenluo0429 对呀,怎么解决
toma77
2021-03-09 17:12:20 +08:00
setTimeout 包一下 return
sannyzeng
2021-03-09 17:13:11 +08:00
用 4 楼的方法,没问题啊
wangxiaoaer
2021-03-09 17:14:48 +08:00
一句话,现在的 verify 是同步函数里面调用了异步方法,所以得不到内部异步的处理结果。

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

答案:

if 死循环等待

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

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

你可以你需要调用 verify() 结果的代码写成函数,在响应回调里调用。比如函数名 update_verify,update_verify(res.data.ret)
chenluo0429
2021-03-09 17:22:35 +08:00
1. promise 包装一层
2. verify 接受一个 callback 函数作为参数,让 callback 来接收 ret
RickyC
2021-03-09 17:31:10 +08:00
@toma77 我想到的也是这个。不知道有什么优雅的方法吗
eason1874
2021-03-09 17:35:03 +08:00
@RickyC #19 优雅的方法就是回调啊,callback,很多人都说了。没必要用定时器

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/760049

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX