3

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

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

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

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

4

3 回答 3

8

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

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

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

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


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

于 2015-03-12T02:16:32.050 回答
1

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

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

于 2015-03-12T02:22:47.933 回答
0

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

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

例如:

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

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

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

于 2015-03-12T02:25:24.157 回答