【问题标题】:Node.js: How to programmatically determine asynchronous?Node.js:如何以编程方式确定异步?
【发布时间】:2015-03-12 02:12:10
【问题描述】:

我希望能够采用不接受回调的函数并确定它是否会异步执行。

特别是,我正在使用 mraa 在 Intel Edison 上使用 Node.js,它具有原生 C++ 实现的函数,例如不接受回调的 i2c.readReg(address)

  1. 如何确定某个函数是否正在阻塞处理器以供其他系统进程使用?
  2. 如何确定其他 JS 是否可以在此期间运行?

或者我什至没有以正确的方式接近这个?

【问题讨论】:

  • 你不能这样做。要知道这是否是正确的方法,我们必须知道你正在接近什么。为什么需要以编程方式进行?
  • 通过以编程方式进行,我在进行回调功能请求或拉取之前进行研究。如果它是一个非阻塞函数调用(因为它深入到一些系统级函数),那么可能真的不需要回调。
  • 如果是纯 JS 那么你可能会检查返回的值是否是一个承诺。但是,由于您使用的是本机函数,这可能是不可能的。因此,我必须选择@minitech。您无法以编程方式确定函数是否是异步的。
  • 我的假设是 C/C++ 代码总是阻塞,如果你想要异步,那么你必须使用 fork/join 或其他形式的线程。如果是这样,那么我会假设您的所有本机 C++ 函数都是同步的,因为异步性将由 C++ 代码本身内的fork/join 处理(即,在异步操作完成之前它不会返回)。我说的对吗?
  • @AaditMShah - C/C++ 并不总是阻塞。例如,Win32 API 中有非阻塞 IO。 Socket IO 早就有了在所有平台上使用的非阻塞方式。

标签: javascript node.js asynchronous intel-edison


【解决方案1】:

您无法真正以编程方式确定异步性。从提供的 API 中应该很清楚,因为如果它是异步的,那么在您使用它的方式中几乎必须有这种迹象。

如果一个函数是异步的,那么这意味着它不会直接从函数调用返回结果,因为函数在结果准备好之前就返回了。因此,函数的文档必须告诉您如何获取结果,如果它是异步的,则必须有另一种机制,例如:

  1. 一个可以传入的回调函数
  2. 返回的承诺
  3. 对象上的某种事件监听器
  4. 其他一些通知机制
  5. 检查函数代码
  6. 函数命名约定(如node.js使用的后缀“Sync”)

如果函数直接返回函数调用的结果,那么它是同步的,其他Javascript代码在调用期间不会运行。


如果一个函数还不是异步的,将其转换为异步操作的唯一方法是在不同的线程或进程中运行它并将值编组回主线程(在主线程中调用某种回调当值准备好时)。

【讨论】:

    【解决方案2】:

    您可以使用 acorn 之类的工具分析转换为抽象语法树的 js。您可以检查函数参数是否被执行。但是,很难判断它是作为回调执行还是出于其他目的。您还可以检查是否正在调用阻塞函数。

    我不确定这是否能让你一路走好,但它会是一个方便的工具。

    【讨论】:

      【解决方案3】:

      不完全是解决方案,只是对可能确实是解决方案的案例的提示。

      许多框架或库定义了可以同步或异步工作的函数,具体取决于是否给出了最后一个函数参数(回调)。

      例如:

      function dummy_sync_or_async(data, callback)
      {
        if (callback)
        { 
           // call async code
           //..
           callback(result);
        }
        else
        {
          // call sync code
          // ..
          return result;
        } 
      }
      

      然后可以检查接收到的参数数量(例如,如果作为这些函数方法的代理工作)并根据函数签名检查这些参数(即function.length

      然后可以决定是在同步还是异步模式下调用该函数。

      【讨论】:

        猜你喜欢
        • 2015-11-17
        • 2011-09-23
        • 1970-01-01
        • 2021-11-29
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 2015-07-21
        相关资源
        最近更新 更多