$(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
sevenzhou1218 2020-08-19 09:49:42 +08:00 2
php 程序员经常干这事....
|
7
AngryPanda 2020-08-19 09:58:07 +08:00
@sevenzhou1218 我都懒得骂你
|
8
masker 2020-08-19 10:03:30 +08:00 via Android 1
@sevenzhou1218 蠢比?
|
9
flowfire 2020-08-19 10:14:38 +08:00 1
|
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 1
|
14
qiayue 2020-08-19 10:28:27 +08:00 2
@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 1
@sevenzhou1218 你这种人需要拉黑?我就喜欢看你上蹿下跳。
|
21
Biwood 2020-08-19 10:44:14 +08:00 1
回楼主的 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 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
|