Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止javascript调用延迟出现

防止javascript调用延迟出现
EN

Stack Overflow用户
提问于 2014-12-18 12:47:18
回答 2查看 101关注 0票数 0

我有一个问题,一个简单的视觉效果没有出现时,打电话时,而是被大大推迟,几乎是直到点,它是没有意义的。

我试图同步获取一些数据(是的,这是对的,而不是异步的),在发生时设置一个“等待”指示符,然后在get完成后隐藏该指示符。问题是在执行代码时没有出现指示符;在调用时不会出现jQuery show()调用的可视化结果--它正在等待数据获取完成。我已经确认,show()调用确实发生在数据通过将时间戳记录到控制台而得到之前。

然而,奇怪的是,控制台日志记录也会在视觉上延迟,即使时间戳可以确认代码是在您预期的情况下发生的。

最后,但至少,如果我在数据获取之前引入一个警告()调用,那么当警报上升时,所有的可视内容都会发生,它不会等到数据获取完成。

这是密码。请再次注意,数据get是对$.ajax()的同步调用(即异步: false)。

代码语言:javascript
运行
AI代码解释
复制
fillInClient: function(clientId) {
  var result, spinner;
  console.log("spinning at " + ($.now()));
  spinner = $("tr#client_" + clientId + " .spinner");
  spinner.show();

  // if I call alert("foo") here, I see both of the spinner.show() and 
  // the first console.log immediately. Then after a few seconds, 
  // I see the hide, and the second console.log

  // Without alert(), I never see the show() and the first console.log
  // doesn't appear until after this:

  // this takes several seconds
  result = $.ajax({
    type: "GET",
    url: "/advisor/householding/accounts?user=" + clientId,
    async: false
  });  
  spinner.hide();
  console.log("stopping at " + ($.now()));
  return result;
}

这是我在控制台上看到的。请注意,它们有效地同时出现,但是从时间戳中可以看到它们被称为间隔数秒。

代码语言:javascript
运行
AI代码解释
复制
spinning at 1418933857688
stopping at 1418933862374

提前谢谢..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-18 13:10:21

浏览器将尝试重新绘制每个n ms,如果浏览器在那个时候被阻塞(调用堆栈不是空的),它将等到堆栈为空才呈现。在您的示例中,您将显示spinner,发送同步ajax请求,然后隐藏该自旋器。这意味着在显示自旋器和隐藏自旋器之间,调用堆栈永远不会空,因此浏览器永远不会重新绘制,因此在浏览器呈现它之前,您的旋转器是隐藏的。

要解决这个问题,您需要将阻塞的代码从堆栈中移出,以便在浏览器被阻塞之前进行浏览器呈现。但是,这通常是使用setTimeout完成的,这将彻底破坏代码的工作方式,以至于它可能是一个异步请求。下面的代码仍然使用与setTimeout同步的请求

代码语言:javascript
运行
AI代码解释
复制
fillInClient: function(clientId, doneCallback) {
  var result, spinner;
  console.log("spinning at " + ($.now()));
  spinner = $("tr#client_" + clientId + " .spinner");
  spinner.show();

  setTimeout(function () {
    var result = $.ajax({
      type: "GET",
      url: "/advisor/householding/accounts?user=" + clientId,
      async: false
    });
    doneCallback && doneCallback(result);
    spinner.hide();
    console.log("stopping at " + ($.now()));
  }, 20);
  //return result;
}

如您所见,您的函数不再返回结果,而是必须有一个回调。此时,您最好把它变成一个异步请求,然后丢失setTimeout

代码语言:javascript
运行
AI代码解释
复制
fillInClient: function(clientId, doneCallback) {
  var result, spinner;
  console.log("spinning at " + ($.now()));
  spinner = $("tr#client_" + clientId + " .spinner");
  spinner.show();

  $.ajax({
    type: "GET",
    url: "/advisor/householding/accounts?user=" + clientId
  })
  .done(doneCallback)
  .always(function () {
    spinner.hide();
    console.log("stopping at " + ($.now()));
  });
}
票数 0
EN

Stack Overflow用户

发布于 2014-12-18 13:10:04

这是我的建议。对同步请求使用AJAX是完全不必要的。若要为异步代码提供同步感觉,请使用回调。下面是一个例子:

代码语言:javascript
运行
AI代码解释
复制
fillInClient: function(clientId) {
    var result, spinner;
    console.log("spinning at " + ($.now()));
    spinner = $("tr#client_" + clientId + " .spinner");
    spinner.show();
    result = $.ajax({
        type: "GET",
        url: "/advisor/householding/accounts?user=" + clientId,
        complete: function (){
            spinner.hide();
            console.log("stopping at " + ($.now()));

            //Other logic to run after the call completes
        }
    });
}

所以,在同步函数之后,我已经转到了complete()函数,所以只有在AJAX调用完成之后,它才会运行。我想不出有什么合理的理由去做这件事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27555405

复制
相关文章
位、字节、字的区别
字(Word)代表计算机处理指令或数据的二进制数位数,是计算机进行数据存储和数据处理的运算的单位。
Lokinli
2023/03/09
6740
原子操作和互斥锁的区别
这个系列的文章里介绍了很多并发编程里经常用到的技术,除了Context、计时器、互斥锁还有通道外还有一种技术--原子操作在一些同步算法中会被用到。今天的文章里我们会简单了解一下Go语言里对原子操作的支持,然后探讨一下原子操作和互斥锁的区别。
KevinYan
2020/06/16
4.6K0
Jquery的属性操作和DOM操作
       3 val()    :     获取或设置表单内容    (原生JS使用value)
用户3159471
2018/09/13
1.4K0
Jquery的属性操作和DOM操作
SDRAM的操作和配置
在有的项目中我们需要扩展外扩SDRAM,所以需要操作SDRAM,以使用STM32H743主控芯片的FMC外设控制器为例子来说明,可以使用STM32CubeMX生成配置初始化代码,完了后需要添加一些代码才能保证SDRAM正常工作,本篇笔记主要介绍SDRAM的操作和读写。
用户1605515
2020/04/26
6920
比特、字节、字
计算机里的信息是以什么样的形式存在计算机里的呢?是不是说计算机里有一张纸,然后可以把信息写上去呢? 我想大家首先想到的硬盘……和内存。 这就是比特、字节和字的关系。
mwangblog
2018/07/04
3160
HTTP 1.0 和 HTTP 1.1 的主要区别是什么
HTTP 1.0 最早在网页中的使用是在 1996 年,那个时候只是使用一些较为简单的网页和网络请求上,而 HTTP 1.1 则在 1999 年才开始广泛应用于现在的各大浏览器网络请求中,同时 HTTP 1.1 也是当前使用最为广泛的 HTTP 协议。 两者的主要区别体现在:
happyJared
2019/06/20
4.1K0
常用的高防有哪几类?主要的区别是什么?
有一些用户受到DDOS攻击的时候,不知道自己该选择什么样的高防来防御攻击,墨者安全今天主要讲下常用的高防有哪几类?以及主要的区别?高防主要分为HTTPS高防、TCP高防、CDN高防、香港高防、海外高防。
墨者安全筱娜
2019/04/15
2.5K0
常用的高防有哪几类?主要的区别是什么?
NFS操作和部署
如果出现以上结果,表示服务端配置成功 最好在本地挂载一次,挂载成功在取消挂载,至少可以确认服务端配置正确,能够挂载 6) 设置开机自启动并检查
jackxiao
2021/11/16
5630
Cache 和 Buffer 都是缓存,主要区别是什么?
原文链接:https://www.zhihu.com/question/26190832/answer/830615125
业余草
2019/11/12
2750
Cache 和 Buffer 都是缓存,主要区别是什么?
提到这个问题,可能意味着题主意识到了两者的相关性。的确,他们确实有那么一些联系。
老钱
2019/09/25
1.6K0
Cache 和 Buffer 都是缓存,主要区别是什么?
Docker:镜像操作和容器操作
古时的风筝
2018/01/08
1K0
Cache 和 Buffer 都是缓存,主要区别是什么?
首先cache是缓存,buffer是缓冲,虽然翻译有那么一个字的不同,但这不是重点。
良月柒
2019/11/07
3610
css特殊操作和效果
(8) 渐变 background-image: repeating-linear-gradient(red, yellow 10%, green 20%);
前端小tips
2021/12/07
4250
css特殊操作和效果
java中的字节流和字符流的区别是什么?
java当中有两种流,一种是字节流(byte stream): 以1字节(8-bit)为单位进行读/写,一次处理一个字节。另一种是字符流(character stream):,以字符为单位,一次处理一个字符。
马克java社区
2021/05/06
4560
java中的字节流和字符流的区别是什么?
字节、字、bit、byte的关系
字 word 字节 byte 位 bit,来自英文bit,音译为“比特”,表示二进制位。 字长是指字的长度
全栈程序员站长
2022/09/01
3K0
Cache 和 Buffer 都是缓存,主要区别是什么?【转】
作者:Towser 链接:https://www.zhihu.com/question/26190832/answer/32387918 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 不知道为什么这问题突然火了,更新一个一句话总结:cache 是为了弥补高速设备和低速设备的鸿沟而引入的中间层,最终起到加快访问速度的作用。 而 buffer 的主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平稳的小数量较大规模的 I/O,以减少响应次数(比如从网上下电影
233333
2018/07/04
2K0
Nilearn中的基本操作和查看
Rose小哥今天给大家介绍一款用于神经成像工具Nilearn以及它的基本操作和数据保存查看。
脑机接口社区
2020/06/30
1.4K0
Nilearn中的基本操作和查看
Clojure文件操作和惰性序列
数据一般都是存储在纯文本文件当中,存储的形式多种多样。本文,我会介绍如何在Clojure中读取和写入这些数据。
lambeta
2018/08/17
3.2K0
Python列表常见操作和注意
常见操作 列表很常用,每一个元素之间用 , 隔开。 列表中的每一个元素可以是任意类型的数据 数字,字符串,列表,元组,集合,字典 列表可进行的操作 索引(从0开始)、切片、加、成员检查(in,not in),for循环。 Python 表达式 结果 描述 len([1, 2, 3]) 3 长度 [1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] 组合 ['Hi!'] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!'] 重复 3 in [1, 2, 3] Tru
py3study
2020/01/19
4530
点击加载更多

相似问题

智能家居操作和DialogFlow操作之间的主要区别

10

伪操作和机器操作的区别?

12

Oozie >异步操作和同步操作之间的区别是什么?

16

Delphi字节操作和Java

11

增加虚拟字节的操作和函数

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档