2015-03-12 4 views
1

Я хотел бы иметь возможность использовать функцию, которая не принимает обратный вызов и определяет, будет ли она выполняться асинхронно.Node.js: Как программно определить асинхронный?

В частности, я работаю с Node.js на Intel Edison, используя mraa, и имеет встроенные функции C++, такие как i2c.readReg(address), который не принимает обратный вызов.

  1. Как определить, блокирует ли функция процессор для других системных процессов?
  2. Как определить, может ли другая JS работать в промежуточный период?

Или я даже не подхожу к этому правильным способом?

+2

Вы не можете этого сделать. Чтобы узнать, подходит ли это подход, нам нужно знать, к чему вы приближаетесь. Зачем вам это нужно программно? – Ryan

+0

Выполняя это программно, я делаю свое исследование, прежде чем сделать запрос функции обратного вызова или потянуть. Если это неблокирующий вызов функции (так как он переходит на некоторые функции уровня системы), то, вероятно, не будет необходимости в обратных вызовах. – srlm

+0

Если бы это был чистый JS, тогда вы, вероятно, могли бы проверить, было ли возвращенное значение обещанием. Однако, поскольку вы используете собственные функции, это может быть невозможно. Следовательно, я должен пойти с @minitech на этом. Вы не можете определить программно, является ли функция асинхронной. –

ответ

4

Вы не можете определить асинхронность программно. Это должно быть ясно из представленного API, потому что, если он асинхронный, то в значительной степени должны быть признаки этого в том, как вы его используете.

Если функция асинхронна, это означает, что она не возвращает результат непосредственно из вызова функции, потому что функция возвращается до того, как результат будет готов. Таким образом, документация для функции должна сказать вам, как получить результат, и если это асинхронное там должна быть другой механизм, такие как:

  1. функция обратного вызова вы можете передать в
  2. возвращенного обещание
  3. своего рода слушатель событий на объекте
  4. другого механизма уведомления
  5. изучить код функции
  6. функции именования, (например, суффикса «синхронизации», что node.js использования)

Если функция напрямую возвращает результат вызова функции, то она синхронна, а другой код Javascript не будет работать во время этого вызова.


Если функция уже не асинхронный, единственный способ превратить это в асинхронной операции, чтобы запустить его в другом потоке или процессе и Маршаллу значение обратно в основной поток (вызов какой-то функции обратного вызова в основном потоке, когда значение будет готово).

1

Вы можете анализировать js, преобразованные в абстрактное синтаксическое дерево с помощью инструмента, такого как желудь. вы можете проверить, выполняются ли аргументы функции. однако было бы трудно сказать, выполняется ли оно в качестве обратного вызова или для какой-либо другой цели. вы также можете проверить, вызываются ли функции блокировки.

Я не уверен, что это приведет вас сюда, но это будет удобный инструмент.

0

Это не совсем решение, просто подсказка о случаях, которые могут быть действительно решением.

Многие франшизы или библиотеки определяют функции, которые могут работать синхронно или асинхронно, в зависимости от того, задан ли последний аргумент функции (обратный вызов).

Например:

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

Тогда можно проверить количество аргументов, полученных (например, при работе в качестве прокси для этих методов функции) и проверить их против подписи функции (т.е. function.length)

Затем можно решить, будет ли функция вызываться синхронно или асинхронно.

Смежные вопросы