Node.js: ¿Cómo determinar mediante progtwigción asíncrono?

Me gustaría poder tomar una función que no tome una callback y determinar si se ejecutará de forma asíncrona.

En particular, estoy trabajando con Node.js en Intel Edison usando mraa , y tiene funciones implementadas en C ++ nativas como i2c.readReg(address) que no acepta una callback.

  1. ¿Cómo puedo determinar si una función está bloqueando el procesador para otros procesos del sistema?
  2. ¿Cómo puedo determinar si otros JS pueden ejecutarse mientras tanto?

¿O no me estoy acercando a esto de la manera correcta?

Realmente no se puede determinar la asincronicidad programáticamente. Debería quedar claro a partir de la API presentada, ya que si es asíncrono, debe haber signos de eso en la forma en que se usa.

Si una función es asíncrona, eso significa que no devuelve directamente el resultado de la llamada a la función porque la función regresa antes de que el resultado esté listo. Como tal, la documentación de la función tiene que decirle cómo obtener el resultado y, si es asíncrono, tiene que haber otro mecanismo como:

  1. una función de callback que puede pasar
  2. una promesa devuelta
  3. algún tipo de detector de eventos en el objeto
  4. algún otro mecanismo de notificación
  5. Examinar el código de la función.
  6. convención de nomenclatura de funciones (como el sufijo “Sync” que usa node.js)

Si la función devuelve directamente el resultado de la llamada a la función, entonces es sincrónica y no se ejecutará ningún otro código Javascript durante esa llamada.


Si una función no es ya asíncrona, la única forma de convertirla en una operación asíncrona es ejecutarlo en un subproceso o proceso diferente y devolver el valor al subproceso principal (llamar a algún tipo de callback en el subproceso principal cuando el valor está listo).

puede analizar js transformado en un árbol de syntax abstracto con una herramienta como bellota. usted podría verificar si los argumentos de la función se ejecutan. sin embargo, sería difícil saber si se estaba ejecutando como una callback o para algún otro propósito. También puede verificar si se están llamando las funciones de locking.

No estoy seguro de si esto te llevaría hasta el final, pero sería una herramienta útil para tener.

Esto no es exactamente una solución , solo un indicio de casos que podrían ser una solución.

Muchos franeworks o bibliotecas definen funciones que pueden funcionar de forma síncrona o asíncrona, dependiendo de si se proporciona el último argumento de la función (la callback).

Por ejemplo:

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

Luego, puede verificar el número de argumentos recibidos (por ejemplo, si trabaja como un proxy para estos métodos de función) y compararlos con la firma de la función (es decir, function.length )

Entonces, uno puede decidir si la función se llama en modo sincronizado o asíncrono.