首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JS异步函数停止页面加载

JS异步函数停止页面加载
EN

Stack Overflow用户
提问于 2018-10-02 10:39:44
回答 2查看 597关注 0票数 0

我有一页有桌子的书。在页面加载时,此表将使用数据进行更新。一旦创建了表,我需要类似线程的东西,这样就可以每隔几秒钟刷新一次。

现在,在ajax调用中获取数据之后。如果我调用asyncThread() --表不加载在页面上,UI就挂起,并被固定在一个循环中。如何在调用asyncThread()函数时防止UI挂起?

代码语言:javascript
复制
 $.ajax({
                url: 'xxxxxxxxx',
                contentType: 'application/html ; charset:utf-8',
                type: 'GET'
            }).success(function (result) {
                $('#table')
                    .DataTable(
                        {
                            paging: false,
                            "ordering": false,
                            "language": {
                                "decimal": ",",
                                "thousands": "."
                            },
                            searching: false,
                            "scrollCollapse": true,
                            "scrollY": "75vh"
                        });
                asyncThread();
            }).error(function () {

            });

代码语言:javascript
复制
    async function asyncThread() {
        while (true) {
            console.log('loop started');
            setTimeout(function () {
                console.log('sleep');
            }, (3 * 1000))
        }           

    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-02 10:51:07

让我们首先分析一下您的asyncThread方法

代码语言:javascript
复制
async function asyncThread() {
    while (true) {
        console.log('loop started');
        setTimeout(function () {
            console.log('sleep');
        }, (3 * 1000))
    }           

}

您在这里所做的工作表明,您不了解JavaScript引擎是如何工作的:

  • JavaScript是单线程的。
  • async方法返回一个隐式承诺,它们实际上不运行异步
  • 您的while循环将无限期地运行,您的setTimeout函数将永远不会执行,因为只有当您的JavaScript引擎有时间执行其他事情时(因为它不能执行,因为它被困在while循环中),这才会发生。

通常,对于这些轮询请求,您将依赖于setIntervalsetTimeout。第一个将定期执行一个函数,直到调用clearInterval或卸载该页面为止;第二个将运行一次,除非在超时过期之前调用clearTimeout

async表示该函数将返回一个承诺,然后您可以通过允诺链处理该承诺,或者从另一个async方法中,您可以await它的成功完成。

票数 4
EN

Stack Overflow用户

发布于 2018-10-02 10:54:14

好的,您有无限循环while (true) {...},它阻塞主线程。我想,你要找的是

代码语言:javascript
复制
function asyncThread() {
    console.log('loop started');
    setTimeout(() => {
        console.log('sleep');
        asyncThread();
    }, 3000)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52606701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档