
$(document).ready(function () { $.ajax({ url: "{% url 'func' %}?x={{ x }}&y={{ y }}", success: function (response) { if (response.count >= 0) { z = response.count; alert(z) # 可以弹框 } } }); alert(z) # 没有反应 这里确实是异步的问题
<script> $(document).ready(function () { $.ajax({ async: false, url: "{% url 'func' %}?x={{ x }}&y={{ y }}", success: function (response) { if (response.count >= 0) { z = response.count; alert(z) # 可以弹框 } } }); alert(z) # 可以弹框 }); </script> 我现在的问题是怎么在下面这个使用z <script> alert(z) </script> 我不是js,也不是php程序员,就是有个前端需求需要我来写一下。
大家没必要因为语音不同起争执,以和为贵。
1 toma77 2020-08-19 09:34:42 +08:00 Uncaught ReferenceError: z is not defined |
2 kop1989 2020-08-19 09:36:07 +08:00 js 当你给某个变量赋值时,如果这个变量没声明过,会进行声明。 但是你最下面的 alert(z),这个 z 还未进行过任何声明 /赋值。必然是抛异常的。 |
3 masker 2020-08-19 09:37:42 +08:00 via Android 多扎实基础吧。 作用域 |
4 TomVista 2020-08-19 09:39:02 +08:00 alert(z) 时$.ajax 还没运行 |
5 Yumwey 2020-08-19 09:39:14 +08:00 执行上下文中,z 尚未声明,ajax 异步了。 |
6 |
7 AngryPanda 2020-08-19 09:58:07 +08:00 @sevenzhou1218 我都懒得骂你 |
8 masker 2020-08-19 10:03:30 +08:00 via Android @sevenzhou1218 蠢比? |
9 flowfire 2020-08-19 10:14:38 +08:00 |
11 sevenzhou1218 2020-08-19 10:22:56 +08:00 |
12 toma77 2020-08-19 10:23:59 +08:00 @flowfire 这里就是异步的问题,z = response.count 这种不加 var/const/let 声明的是全局变量 |
| 13 AngryPanda 2020-08-19 10:26:00 +08:00 |
14 qiayue PRO @sevenzhou1218 你遇到的 PHP 程序员都干这事,你的反思反思,为什么会与这样的 PHP 程序员为伍 3 |
16 Biwood 2020-08-19 10:35:19 +08:00 https://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFJavascript.html 阮一峰老师这篇博客很好的解释了 Javascript 里面同步和异步的区别,建议认真看看。对于新手来说,这块确实不好理解,大家都是这么一步步走过来的。 |
17 masker 2020-08-19 10:38:40 +08:00 via Android @sevenzhou1218 都不是。 单纯觉得你的发言蠢。 |
18 sevenzhou1218 2020-08-19 10:38:59 +08:00 |
19 sevenzhou1218 2020-08-19 10:39:49 +08:00 |
20 AngryPanda 2020-08-19 10:41:17 +08:00 @sevenzhou1218 你这种人需要拉黑?我就喜欢看你上蹿下跳。 |
21 Biwood 2020-08-19 10:44:14 +08:00 回楼主的 Append 的内容:你没法直接在下面使用 z,你需要把下面的逻辑封装成函数,比如 function nextStep( count ) { ... } 然后在 success 回调里面调用 nextStep 函数,把 z 当做参数传进去即可。 |
22 dapengzhao OP @Biwood 感谢,我试一下 |
23 sixway 2020-08-19 10:58:41 +08:00 使用未声明的变量,这样的做法并不好。 局部变量,全局并不能访问。可以提升,或者使用闭包。或者使用楼上说的 |
24 czkm1320 2020-08-19 11:12:43 +08:00 就是异步问题,不信可以 setTimeout(()=>{console.log(z)},100) 试试 |
25 azh7138m 2020-08-19 13:36:58 +08:00 via iPhone 这和 js 有个鸡儿关系 别的语言照样有这种异步的问题啊 自己菜不要怪语言 |
26 NasirQ 2020-08-19 14:03:23 +08:00 归根结底,请求异步啊 |
27 dapengzhao nbsp; OP @azh7138m 大佬,我也没说自己牛逼啊,这也确实是在 js 遇到的问题啊,我应该贴个 js 代码,说这个 java 问题怎么解决?还有我就是菜这我很坦然的承认,碍着大神眼了,我的锅,我的锅,大神出门左拐,慢走不送啊。。。。。。 |
29 xingyuc 2020-08-19 15:50:52 +08:00 你们说话就不能友好点么,戾气那么重 |
30 nmdx 2020-08-19 16:25:43 +08:00 via Android 这可能是一个新手经常懵逼的地方。。想当年因为这个问题才弄懂了什么叫异步 |
32 azcvcza 2020-08-19 16:35:21 +08:00 不明白的地方都打上 log 呗 |
33 netnr 2020-08-19 16:44:34 +08:00 方式一:回调,把 ajax 请求封装成回调函数,后面的脚本写在回调函数里面,当然 ajax 返回的值可以做缓存 方式二:Promise,同上,写法不一样,优雅一些 |
34 sunwang 2020-08-19 17:39:48 +08:00 没有反应是因为你使用了一个没有定义的变量,js 报错不执行了。 关于你想在下面使用使用,建议你写在函数里,在 success 成功回调里去传入 z 参数执行函数。 |
35 TomVista 2020-08-20 09:34:29 +08:00 jq 的话,就无限套 callback |