节点.js:如何以编程方式确定异步
Node.js: How to programmatically determine asynchronous?
>我希望能够接受一个不接受回调的函数并确定它是否会异步执行。
特别是,我正在使用 mraa 在英特尔 Edison 上使用 Node.js,它具有本机C++实现的功能,例如不接受回调的 i2c.readReg(address)
。
- 如何确定某个函数是否阻塞了其他系统进程的处理器?
- 如何确定在此期间是否可以运行其他 JS?
或者我什至没有以正确的方式接近这一点?
您无法真正以编程方式确定异步性。 从提供的 API 中应该很清楚,因为如果它是异步的,那么在你使用它的方式中几乎必须有迹象。
如果函数是异步的,则意味着它不会直接从函数调用返回结果,因为函数在结果准备就绪之前返回。 因此,该函数的文档必须告诉您如何获取结果,如果它是异步的,则必须有另一种机制,例如:
- 可以传入的回调函数
- 返回的承诺
- 对象上的某种事件侦听器
- 其他一些通知机制
- 检查函数的代码
- 函数命名约定(例如节点使用的后缀"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)检查这些参数。
然后可以决定是在同步模式下还是异步模式下调用该函数。
- 以编程方式填充组合框道场 (1.8) 的最佳方法是什么?
- 以编程方式选择文本Mobile Safari
- Thunderbird,如何以编程方式选择第一个选项卡
- 以编程方式获取无线接入点列表
- 使用Javascript/jQuery以编程方式将当前锚点/哈希/片段附加到任何表单操作url
- 通过javascript以编程方式将文件插入HTML输入
- 如何以非编程方式国际化HTML文本
- Y组合器如何以编程方式计算不动点
- 如何以编程方式添加到可变嵌套对象中
- 在视图中渲染多个按钮以编程方式进行本机反应
- 为什么我在以编程方式打开窗口时遇到问题
- 以编程方式添加的复选框的值
- 以编程方式将fabric-js-canvas的图像替换为hq图像,并重新计算其他对象的坐标和大小
- 可以't以编程方式关闭jQuery移动弹出窗口中的可折叠部分
- 以编程方式调用javascript函数
- 如何以编程方式查找javascript语法错误的位置
- 以编程方式将特定的JavaScript添加到Qualtrics中的特定问题中
- 当以编程方式更改输入值时,不会执行更改时事件
- 如何以编程方式在 jsTree 中选择一个节点并打开所有父节点
- 以编程方式打开<选择>选取器