节点.js:如何以编程方式确定异步

Node.js: How to programmatically determine asynchronous?

本文关键字:编程 方式确 异步 js 节点      更新时间:2023-09-26

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

特别是,我正在使用 mraa 在英特尔 Edison 上使用 Node.js,它具有本机C++实现的功能,例如不接受回调的 i2c.readReg(address)

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

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

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

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

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

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


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

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

我不确定这是否会让你一路走到那里,但它将是一个方便的工具。

不完全是一个解决方案,只是对可能确实是一个解决方案的情况的提示。

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

例如:

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

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

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