Я попытался выяснить, как именно следует писать асинхронные функции. После долгого изучения большого количества документации мне все еще неясно.
Как мне написать асинхронные функции для Node? Как правильно реализовать обработку событий ошибок?
Другой способ задать свой вопрос: как мне интерпретировать следующую функцию?
var async_function = function(val, callback){
process.nextTick(function(){
callback(val);
});
};
Кроме того, мне показался интересным этот вопрос о SO («Как мне создать неблокирующую асинхронную функцию в node.js?»). Мне кажется, что на него еще нет ответа.
setTimeout
иsetInterval
в своем любимом браузере и поиграть с ними. Или обратные вызовы ajax (возможно, наиболее близкие к опыту работы с узлами), или прослушиватели событий для вещей, с которыми вы знакомы, например, событий щелчка и загрузки. Асинхронная модель уже существует в браузере, и они точно такие же в node.Ответы:
Кажется, вы путаете асинхронный ввод-вывод с асинхронными функциями. node.js использует асинхронный неблокирующий ввод-вывод, потому что неблокирующий ввод-вывод лучше. Лучший способ понять это - пойти посмотреть несколько видео Райана Даля.
Просто напишите обычные функции, с той лишь разницей, что они не выполняются сразу, а передаются как обратные вызовы.
Обычно API дает обратный вызов с ошибкой в качестве первого аргумента. Например
Это общий образец.
Другой распространенный паттерн:
on('error')
. НапримерРедактировать:
Вышеупомянутая функция при вызове как
Будет печатать
42
на консоль асинхронно. В частностиprocess.nextTick
срабатывает после того, как текущий стек вызовов eventloop пуст. Этот стек вызовов пуст после выполненияasync_function
иconsole.log(43)
выполнения. Итак, мы печатаем 43, а затем 42.Вам, вероятно, следует почитать цикл событий.
источник
Недостаточно просто пропустить обратные вызовы. Например, вы должны использовать settimer, чтобы сделать функцию асинхронной.
Примеры: Не асинхронные функции:
Если вы запустите приведенный выше пример, это должно быть хорошо, придется подождать, пока эти функции не закончат работу.
Псевдопоточные (асинхронные) функции:
Этот будет действительно асинхронным. Это должно быть хорошо, будет написано до завершения async.
источник
Вы должны посмотреть это: Node Tuts, серия 19 - Шаблоны асинхронных итераций
Он должен ответить на ваши вопросы.
источник
Если вы ЗНАЕТЕ, что функция возвращает обещание, я предлагаю использовать новые функции async / await в JavaScript. Благодаря этому синтаксис выглядит синхронным, но работает асинхронно. Когда вы добавляете
async
ключевое слово в функцию, оно позволяет вам выполнятьawait
обещания в этой области:Если функция не возвращает обещание, я рекомендую заключить его в новое обещание, которое вы определяете, а затем разрешите данные, которые вы хотите:
Итог: используйте мощь обещаний.
источник
Попробуйте это, это работает как для узла, так и для браузера.
источник
Я потратил слишком много часов на такую задачу для node.js. Я в основном фронтенд-парень.
Я считаю это очень важным, потому что все асинхронные методы узла имеют дело с обратным вызовом, и преобразование его в Promise лучше справляется с этим.
Я просто хочу показать возможный результат, более компактный и читаемый. Используя ECMA-6 с async, вы можете написать это так.
(undefined || null)
для Repl (чтение событий цикла печати) сценариев, используя неопределенные также работу.источник