首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是什么决定了哪些Javascript函数是阻塞的还是非阻塞的?

是什么决定了哪些Javascript函数是阻塞的还是非阻塞的?
EN

Software Engineering用户
提问于 2013-06-19 18:30:33
回答 4查看 17.6K关注 0票数 29

我一直在做基于网络的Javascript (香草JS,jQuery,主干等)几年来,我一直在使用Node.js做一些工作。我花了一段时间才掌握了“非阻塞”编程的诀窍,但我现在已经习惯了在IO操作等方面使用回调。

我知道Javascript本质上是单线程的。我理解节点“事件队列”的概念。我不明白的是,是什么决定了单独的javascript操作是“阻塞”还是“非阻塞”。我如何知道我可以依赖哪些操作来同步生成输出,以便在以后的代码中使用,以及我需要向哪些操作传递回调,以便在初始操作完成后处理输出?是否有异步/非阻塞的Javascript函数列表,以及同步/非阻塞的Javascript函数列表?是什么阻止我的Javascript应用程序成为一个巨大的种族条件?

我知道需要很长时间的操作,比如Node中的IO操作和web上的AJAX操作,都要求它们是异步的,因此需要使用回调--但是谁来决定什么才是“长时间”呢?这些操作中是否有某种触发器将它们从正常的“事件队列”中移除?如果不是,是什么使它们不同于简单的操作,比如将值赋值给变量或循环数组,这似乎可以依赖于以同步的方式完成?

也许我甚至没有正确地想过这件事--希望有人能纠正我。谢谢!

EN

回答 4

Software Engineering用户

回答已采纳

发布于 2013-06-19 18:37:22

通常,任何在一段时间内进行联网或使用计时器执行任务的函数都是异步的。

如果函数接受回调,则可以查看回调的用途,通常很明显,回调是否是异步的。如果函数不提供回调,那么它就无法通信异步结果,因此很可能不是异步的。

没有铁板一块的方法可以确定。它必须在文档中对函数进行说明,或者从界面的工作方式来看是显而易见的。

异步操作在幕后与同步操作是不同的,因为异步操作的概念是设置操作、启动操作,然后得到操作进度、完成或错误的通知。迭代数组是一种同步操作。它没有这些问题。代码只是同步运行。发出ajax调用包括为状态通知注册一个回调,然后启动ajax调用,然后继续运行其他javascript,然后在稍后的某个时候,通过ajax调用上的状态更改(例如完成)调用回调。

票数 14
EN

Software Engineering用户

发布于 2013-06-19 18:52:03

据我所知,您不是在问应该做什么异步操作,而是询问如何判断函数是否是异步的。

你查一下文件。说真的-这就是它的目的。您不会根据函数的名称或上下文来猜测它所做的事情。如果您不确定,并且可以访问它的源代码,请检查它。

这是唯一完全可靠的方法。

现在开始猜测。

  • 如果它接受回调或返回承诺,它可能是异步的(我看到了该规则的异常)
  • 通常,在node.js和JavaScript中与I/O相关的所有东西都是异步完成的(我也看到了该规则的异常)
票数 6
EN

Software Engineering用户

发布于 2013-06-19 18:52:50

由于JavaScript是单线程的,所以所有处理块都会出现以下情况之一

1)当前执行请求外部服务,如I/O或网络请求,或webworker请求。

2)将函数调用放在计时器上,以便在以后执行

没有阻塞/非阻塞函数的列表。你应该检查一下文件。

如果多个外部服务在javascript线程上有一个锁,并且尝试同时访问它,您的应用程序可能会遇到竞争情况。现代浏览器和V8引擎处理这个问题,但是如果您使用phonegap并为移动设备编写javascript应用程序,您可能会遇到这种情况。没有支持来处理这些比赛条件。

通常,假设代码块,除非有回调。即使有回调,也不意味着它不会阻止。

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

https://softwareengineering.stackexchange.com/questions/202047

复制
相关文章

相似问题

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