我希望能够接受一个不接受回调的函数,并确定它是否会异步执行。
特别是,我正在使用mraa在英特尔Edison上使用Node.js,并且它具有本机C ++实现的函数,如i2c.readReg(address)
,它们不接受回调。
或者我甚至没有以正确的方式接近这个?
答案 0 :(得分:7)
您无法以编程方式确定异步性。从API中可以清楚地看出,如果它是异步的,那么在你使用它的方式中几乎必须有这些迹象。
如果函数是异步的,那么这意味着它不直接从函数调用返回结果,因为函数在结果准备好之前返回。因此,函数的文档必须告诉您如何获取结果,如果它是异步的,则必须有另一种机制,例如:
如果函数直接返回函数调用的结果,那么它是同步的,并且在该调用期间不会运行其他Javascript代码。
如果函数尚未异步,将其转换为异步操作的唯一方法是在不同的线程或进程中运行它并将值编组回主线程(在主线程中调用某种回调)当值准备就绪时。)
答案 1 :(得分:1)
您可以使用像橡果这样的工具分析转换为抽象语法树的js。你可以检查函数参数是否被执行。但是,很难判断它是作为回调执行还是用于其他目的。您还可以检查是否正在调用阻塞函数。
我不确定这是否会让你一路走来,但这将是一个方便的工具。
答案 2 :(得分:0)
不完全是一个解决方案,只是提示可能确实是解决方案的案例。
许多franeworks或库定义了可以同步或异步工作的函数,具体取决于是否给出了最后一个函数参数(回调)。
例如:
function dummy_sync_or_async(data, callback)
{
if (callback)
{
// call async code
//..
callback(result);
}
else
{
// call sync code
// ..
return result;
}
}
然后可以检查收到的参数数量(例如,如果作为这些函数方法的代理)并根据函数签名检查(即function.length)
然后可以决定是以同步还是异步模式调用该函数。