当前位置:  开发笔记 > 编程语言 > 正文

永远不会调用异步函数的回调

如何解决《永远不会调用异步函数的回调》经验,为你挑选了1个好方法。

我有这个函数,等待异步函数完成它的工作,然后返回.

function synchronous(){
    var notYet = true;

    setTimeout(function(){
        notYet = false;
    }, 1000);

    while(notYet)
        ;

    return "Done synchronously!";
}

console.log(synchronous());

这里函数synchronous停止使用while循环直到异步函数的回调(这里setTimeout)执行.但是,回调永远不会被调用(使用alert回调内部检查),因此,notYet将保留true并且函数循环将永远存在.那么,为什么1000毫秒后回调不被调用?

注意:我不关心如何将异步函数转换为同步函数.我的问题是为什么回调没有被调用?



1> T.J. Crowder..:

回调没有被调用,因为唯一可以调用它的线程就是在进行无限循环.

在浏览器中,JavaScript在单个主UI线程上运行(加上您想要创建的Web工作者数量).该线程在作业队列上运行:它获取要执行的作业(例如,处理单击),执行作业,然后返回以等待下一个作业.你用无限循环来阻止那个线程.计时器调度作业队列中的回调(可能是特定于实现的),但是线程永远不会完成当前作业(调用无限循环的作业),因此它永远不会接受下一个作业.

NodeJS还在单个线程中运行您的代码,同样的事情也是如此.(并非所有环境都这样做,但我不知道任何环境setTimeout不会在请求它的同一个线程上安排定时器回调.)

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有