Javascript 为什么org/arangodb/request是同步的?

Javascript 为什么org/arangodb/request是同步的?,javascript,arangodb,foxx,Javascript,Arangodb,Foxx,为什么新的JavaScript模块是同步的?它应该只在作业队列中使用吗 有没有办法在ArangoDB中发出异步http请求?完全公开:我是ArangoDB开发团队的一员,主要从事Foxx和所有JavaScript的工作。我也是编写org/arangodb/request模块的人 ArangoDB与Node.js是不同的环境,尽管有许多相似之处(例如使用V8 JavaScript引擎)。与Node.js(或浏览器)不同,ArangoDB使用基于线程的并发模型,没有事件循环。然而,这些线程并没有在

为什么新的JavaScript模块是同步的?它应该只在作业队列中使用吗


有没有办法在ArangoDB中发出异步http请求?

完全公开:我是ArangoDB开发团队的一员,主要从事Foxx和所有JavaScript的工作。我也是编写
org/arangodb/request
模块的人


ArangoDB与Node.js是不同的环境,尽管有许多相似之处(例如使用V8 JavaScript引擎)。与Node.js(或浏览器)不同,ArangoDB使用基于线程的并发模型,没有事件循环。然而,这些线程并没有在JavaScript中公开(事实上,在V8中,每个线程都是完全隔离的),所以通常您甚至不必考虑它们

在浏览器和Node.js中,
setTimeout
等功能通过事件循环延迟代码执行(直到经过一定时间或发生外部事件)

在ArangoDB中,代码总是线性执行。例如,传入的HTTP请求在JavaScript中传递给Foxx控制器,并且在控制器返回时立即发送响应。即使您可以使用
setTimeout
,您正在使用的外部资源(甚至是“内部”资源,如文档集合和事务)也可能在延迟的代码执行时已经消失

因此,
org/arangodb/request
模块提供的
request
功能也是完全同步的。它不返回承诺或回调,而是直接返回传入的响应数据。它与npm上的
request
显然也不是同一个模块,而是基于该模块的API的同步实现,只要在Node.js之外可以实现其API(例如,不包括流并返回远程响应,而不是回调)

如果您来自Node.js/io.js背景,这可能会感觉不正确,因为非阻塞io可以实现更高的吞吐量,但请记住,ArangoDB和Node.js的设计目标非常不同。Node.js是围绕流和网络连接构建的。ArangoDB构建为持久数据存储,必须处理事务和锁

如果您有很高的网络延迟可能性,或者如果外部API的响应对客户端响应不是必需的,那么直接从您的Foxx控制器访问外部API可能不是最好的主意。这就是Foxx队列的用途。事务性电子邮件就是一个很好的例子

虽然Foxx的用途非常广泛,但它的主要重点是允许您将大部分应用程序(尤其是从更接近数据的运行中获益的逻辑)直接移动到数据库中。对于中小型项目,您可能可以在边界内进行外部API调用。但是,如果您的应用程序主要关心通过网络与其他服务通信,那么在数据库中运行该代码可能不是最佳解决方案

幸运的是,ArangoDB与其他人配合得很好,因此,如果您发现在更高的负载下网络密集型代码成为性能瓶颈,那么很容易将其移出Foxx。Foxx并没有消除对应用服务器的需求,但它可以大大降低它们的复杂性



作为对Brian答案的更正:遗憾的是,Promissions也不允许您在同步环境中编写异步代码。将承诺定义为必须异步执行。如果它们本机不受支持,则必须在现有函数的基础上构建它们,如
setTimeout
process.nextTick
,ArangoDB都不实现这些函数。

这个问题不应搁置。由于嵌入式操作环境的不同,它是有效的。事实上,这是非常合法的……@Brian Vanderbusch:不要把“有效”或“合法”与“关于主题”混为一谈。当然,这个问题可能是正确的——它不属于这里,因为OP需要外部资源。完全删除这一部分会使问题的主题,但也会使你的答案过时。@BoltClock谢谢你的回答clarification@BoltClock我已经改写了这个问题以符合规则。OP不是要求外部资源,而是要求提供异步请求的方法(平台不支持异步请求,因此外部资源的明确答案是“没有任何,也永远不会有”)。@pluma:看起来不错,感谢您的编辑。感谢您签入并帮助重新打开和解决此问题,以及回复。也很感谢你指出我的答案有什么问题。阿兰戈医生很棒。我知道Foxx没有使用node,因为单线程导致Arango的其他部分出现问题,但我不知道V8上Foxx的同步性质。让我更好地了解在决定何时扩展Arango时如何使用系统资源。@BrianVanderbusch感谢您的反馈。如果您在文档中发现任何可以改进的地方,请随时在GitHub上打开问题或在IRC上联系我。对不起,如果我遇到比你想象的更严厉的话。