Ответ 1
С точки зрения языка это невозможно, и я считаю, что ответ lambda подтверждается.
- Функции могут делать асинхронно, но возвращать что-то синхронно; скажем, вернуть количество асинхронных задач, которые были уволены.
- Функции могут синхронно возвращать promises..., которые представляют асинхронную информацию. Я бы назвал такой метод асинхронным, но язык не может это сказать.
- В некотором извращенном смысле каждая асинхронная функция "возвращает" что-то...
undefined
, если ничего другого.
С технической точки зрения:
- прочитайте документацию.
- Если функция принимает обратный вызов, она скорее асинхронна. Посмотрите на подпись функции.
- Прочитайте код.
- Используйте "здравый смысл". Если функция выполняет IO и возвращает результат из IO, она должна быть, в некоторых случаях, асинхронной. Это включает чтение файлов, чтение со стандартного ввода, сохранение в базу данных и запросы HTTP/AJAX. Для этого часто используются потоки сообщений, которые представляют собой асинхронную задачу, но обратные вызовы являются особыми.
Кроме того, есть функции, которые смешивают два.
function(callback) {
if(ready) {
callback();
}
else {
setTimeout(callback, 5000);
}
}
Возможно, это очень плохо, и правильная практика будет
if(ready) {
process.nextTick(callback);
}
поэтому функция имеет равномерное поведение.
Однако есть хакерский способ сказать, произошло ли что-либо асинхронное, по крайней мере, в Node.js. См. эту дискуссию.
// untested!! please read the documentation on these functions before using yourself
var work = process._getActiveHandles().length + process._getActiveCallbacks().length;
foo;
var newWork = (process._getActiveHandles().length + process._getActiveCallbacks().length) - work;
if(newWork > 0) {
console.log("asynchronous work took place.");
}
Это работает, потому что асинхронная работа не может разрешить по одному тику, по определению, и потому что Node.js однопоточная.