Node.js:如何以编程方式确定asynchronous?

我希望能够采取一个不callback的函数,并确定它是否将asynchronous执行。

特别是,我正在使用mraa在Intel Edison上使用Node.js ,它具有本机C ++实现的function,如不接受callback的i2c.readReg(address)

  1. 我如何确定一个函数是否阻塞了其他系统进程的处理器?
  2. 我怎样才能确定其他JS可以在这个过渡期间运行?

还是我没有接近这个正确的方式?

你不能以编程的方式确定asynchronous性。 从所提供的API中应该清楚,因为如果它是asynchronous的,那么在使用它的方式中就必须有很多迹象。

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

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

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


如果一个函数还不是asynchronous的,把它变成一个asynchronous操作的唯一方法是在不同的线程或进程中运行它,然后将值编组回主线程(当主线程调用某个值准备好了)。

您可以使用类似橡子的工具来分析转换为抽象语法树的js。 你可以检查函数参数是否被执行。 然而,很难判断它是作为callback执行还是用于其他目的。 你也可以检查阻塞函数是否被调用。

我不知道这是否会让你在那里,但它会是一个方便的工具。

不完全是一个解决scheme ,只是提示可能确实是解决scheme的案例。

许多函数库或库定义了可以同步或asynchronous工作的函数,这取决于是否给出了最后一个函数参数(callback函数)。

例如:

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

然后可以检查收到的参数的数量(例如,如果作为这些函数方法的代理),并检查这些函数签名(即函数的长度)

然后可以决定是否在同步或asynchronous模式下调用函数。