2013-09-11 6 views
0

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

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

    exports.getFilename = функция() { return filename; }

  2. Далее при написании функции async записывается функция с обратным вызовом, достаточным для производительности, или же рекомендуется использовать ее с помощью библиотеки потоков?

Извините за несколько очевидный вопрос, я Noramlly являюсь один вызов этих функций

+0

1. Нет 2. В JavaScript/узле нет потоков. –

+0

Хорошо, я знаю, что можно использовать внешнюю библиотеку для потока, и есть кластер, но я не знал, что нет поддержки для реальных потоков. Благодаря! –

+0

@RandomUser Node использует многопоточность (а также мультипроцесс для кластеров). Это просто не делает любой из других доступными для кода JavaScript. Они предназначены только для [родных аддонов] (http://nodejs.org/api/addons.html) для поддержки разработки асинхронных API. –

ответ

0

Callbacks и asynchronousness две разные вещи, хотя они связаны, так как в JavaScript обратных вызовов является единственным механизмом, чтобы позволить вам управлять поток управления в асинхронном коде.

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

Другим примером является функция фильтра, которая изменяет входящие данные и возвращает измененную версию. Array.sort() - хороший пример. Передача функции к ней позволяет применять собственные условия для сортировки массива.

На самом деле, функции фильтрации имеют более вескую причину для приема функций/обратных вызовов, поскольку они изменяют поведение алгоритма. Функции итерации - это просто хороший синтаксический сахар вокруг петель и, следовательно, немного избыточный. Хотя, они делают код приятнее читать.

Погода или не функция должна быть асинхронной - это другое дело. Если для вычисления требуется много времени (например, операций ввода-вывода или больших матричных вычислений), то это должно быть сделано асинхронным. Как долго «длинный» зависит от вашей собственной толерантности. Как правило, для сайта с умеренной занятостью запрос не должен превышать 100 мс (другими словами, вы должны иметь возможность обрабатывать 10 ударов в секунду как минимум). Если операция занимает больше времени, то вы должны разделить ее и сделать ее асинхронной, иначе вы рискуете сделать сайт невосприимчивым к другим пользователям. Для действительно занятых веб-сайтов вы не должны терпеть операции, которые занимают больше 10 мс.

Из приведенного выше объяснения должно быть очевидно, что просто принятие функции или обратного вызова в качестве аргумента не делает функцию асинхронной. Простейшим способом pure-js сделать что-то async является использование setTimeout для разрыва длинных вычислений. Конечно, операция все еще происходит в том же потоке, что и основной процесс узла, но по крайней мере он не блокирует другие запросы. Чтобы использовать многоядерные процессоры на своих серверах, вы можете использовать одну из библиотек потоков для NPM или кластеров, чтобы сделать вашу функцию асинхронной.

+0

Я думаю, что существует разница между параметром, который принимает функцию и «обратный вызов», который будет конкретным прецедентом для принятия функции. «Обратный вызов» - это функция, которую вы вызовете в какой-то более поздней точке, потому что ваш асинхронный код завершается или событие запущено и т. Д., Но это не совсем то же самое, что предоставление функции, которая будет использоваться для сортировки элементов массива , Я думаю, что важно четко понимать, что мы на самом деле подразумеваем под «обратным вызовом». –

+1

@JonSurrell: Не так в программировании javascript. Функция, которая будет вызываться другой функцией, часто называется «обратным вызовом», независимо от того, какая погода является синхронной или асинхронной. Я понимаю, что другие языки программирования и Computer Science имеют другие определения термина. Но программисты javascript использовали его для обозначения просто функции, которая передается как параметр. Это использование распространено в дискуссионных досках, вики-статьях, блогах и книгах. – slebetman

+0

@JonSurrell: Это не единственное слово, где конкретное определение в javascript отличается от общего определения. Javascript использует слово «контекст», например, для ссылки на привязку объектов и цепочку наследования. Обычно «контекст» относится к тому, как оценивается код, например, в контексте определения или контексте выражения. Например, Perl может выполнять код в контексте списка (когда функция/выражение вызывается в построении списка), скалярный контекст и контекст undef. – slebetman

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