Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在从异步函数内部调用node.js中的函数时,是否有任何理由更喜欢这些函数的异步版本?_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript 在从异步函数内部调用node.js中的函数时,是否有任何理由更喜欢这些函数的异步版本?

Javascript 在从异步函数内部调用node.js中的函数时,是否有任何理由更喜欢这些函数的异步版本?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,主要来看FS api,对于大多数函数,似乎有三种风格可供选择: 同步的 异步使用回调 异步使用承诺 异步是使用系统资源的最佳方式,但是,如果我已经在一个异步函数中,并且一直在等待每个调用,那么这与仅仅使用同步调用应该没有什么区别,对吗?对我来说,这就像是一个内置的等待声明 不过,我不知道js/node中是如何实现异步的。如果我从异步函数开始,使用异步函数有什么好处吗?(不包括并行运行异步任务时的场景)异步/等待不等同于同步执行;使使用更容易是一种语法上的糖分(事实上,这些关键字的目标是使承诺更接

主要来看FS api,对于大多数函数,似乎有三种风格可供选择:

  • 同步的
  • 异步使用回调
  • 异步使用承诺
  • 异步是使用系统资源的最佳方式,但是,如果我已经在一个异步函数中,并且一直在等待每个调用,那么这与仅仅使用同步调用应该没有什么区别,对吗?对我来说,这就像是一个内置的等待声明


    不过,我不知道js/node中是如何实现异步的。如果我从异步函数开始,使用异步函数有什么好处吗?(不包括并行运行异步任务时的场景)

    异步
    /
    等待
    不等同于同步执行;使使用更容易是一种语法上的糖分(事实上,这些关键字的目标是使承诺更接近于从编程的角度编写同步代码,因此使用起来更直观)

    async
    在上放置一个任务,该任务将在堆栈上所有挂起的同步执行完成后执行。这样做的好处是显而易见的:进程可以在等待资源可用时进行工作(例如,打开文件涉及系统调用,因此将其设置为非阻塞操作是有意义的)


    如果您已经在一个异步函数中,那么异步操作的优点和缺点与其他任何地方一样。实际上,
    await
    只能在
    异步
    函数中使用。

    使用
    异步
    函数时,应仅基于该函数内部的情况,而不是基于调用它的人。调用方不影响函数是否应为
    异步

    使函数
    异步的原因:

  • 函数中有基于承诺的异步操作,您希望使用
    wait
  • 函数中有基于承诺的异步操作,您希望利用在调用异步操作之前可能发生的同步异常的自动捕获(以及转换为被拒绝的承诺)
  • 这就是在函数前面使用
    async
    关键字的原因

    async
    函数不具备的功能(或对
    async
    函数的常见误解):

  • 它不会神奇地使阻塞代码变成非阻塞代码
  • 这并不能让来电者跑得更快
  • 它不会使同步代码现在在后台异步运行
  • 异步是使用系统资源的最佳方式

    我不知道你说的是什么意思。异步函数允许您以非阻塞方式运行操作,以便Javascript中的主线程可以在异步操作运行时执行其他操作,但这不是
    async
    函数所能实现的。这是由异步操作启用的。两者是不同的

    如果我已经在一个异步函数中,并且正在等待每一个调用,那么这和仅仅使用同步调用应该没有什么区别,对吗

    不对。对返回承诺的函数使用
    wait
    会暂停当前函数的执行(立即返回承诺),但允许主Javascript线程执行其他操作、服务其他请求等。。。使用同步代码将导致阻塞,不允许主线程执行其他操作,从而破坏服务器的可伸缩性

    对我来说,这就像是一个内置的等待声明


    阻塞、同步代码会影响操作期间可能运行的所有其他代码。这与使用
    wait

    不同,同步调用在等待结果时总是会阻止所有其他处理,因此,这与它是否在异步函数中无关——请阅读javascript中的事件循环——只是为了纠正您似乎在操作的假设:异步性并不意味着在同一执行上下文中的并发性。这里出现的并发在语言级别是不可见的。当您处于异步回调或承诺延续中时,该执行上下文仍然阻止线程运行任何其他JavaScript。同步将再次阻塞事件循环。我会尽量说得更清楚。@user81933-这回答了你的问题吗?如果是这样,您可以通过单击答案左侧的复选标记向社区表明这一点,这也将为您按照此处的正确程序赢得一些声誉点数。