Я работаю над Express. При запуске он подключается к серверу Redis и к серверу PostgreSQL. Я хотел бы подождать, пока оба соединения не удастся, прежде чем запускать экспресс-сервер. Теперь, если бы я ожидал только одного обратного вызова, я мог бы инициировать сервер Express в этом обратном вызове. Но как лучше всего это делать, ожидая более чем одной асинхронной операции? Я новичок в этом. Есть ли хороший идиоматический образец для такого рода вещей? Может быть, группировать обещания вместе или ...?Подождите несколько соединений db перед запуском экспресс-сервера?
ответ
Обещания - это то, что вы хотите.
Вы можете использовать .all()
на множестве обещаний дождаться их завершения. Вы не упомянули, какую библиотеку Promise вы используете, но это довольно универсально. вот документация Bluebird: https://github.com/petkaantonov/bluebird/blob/master/API.md#all---promise
Спасибо! Я новичок в плане обещаний и не использовал конкретную реализацию (пока), но у меня была догадка, что обещания могут помочь. Не знал о Bluebird. Поэтому я полагаю, что в моем случае будет массив из двух обещаний: один для соединения redis и один для соединения postgres. И Bluebird имеет функцию promisifyAll, которая выглядит полезной. –
@BobbyCircle Да, это правильно. Все библиотеки обещаний имеют какую-то «все» функцию, благодаря которой вы можете сделать одно обещание из множества обещаний. – Brad
Обещания, вероятно, являются идиоматическим способом решения этой проблемы. Вам придется «обещать» свои функции, которые возвращают обратные вызовы, чтобы превратить их в то, что возвращает и разрешает обещания, но тогда Promise.all()
будет работать нормально. Я лично использую Bluebird для разработки nodejs и регулярно обещаю существующие функции или целые модули, которые используют асинхронные обратные вызовы.
Если вы не иначе, используя библиотеку, которая может promisify без обещанных функций, то вы можете просто использовать счетчик, чтобы отслеживать, когда все ваши обратные вызовы выполняются. Это «старомодный» способ делать что-то, но работает отлично. Такая операция работает следующим образом:
function setup(fn) {
// initialize counter to number of async operations
var counter = 3;
function checkDone() {
--counter;
if (counter <= 0) {
fn();
}
}
firstAsyncFunction(...., checkDone);
secondAsyncFunction(...., checkDone);
thirdAsyncFunction(...., checkDone);
}
setup(function() {
// this will get called when all the initial async operations are done
});
Большое спасибо. Функции «promisify» выглядят действительно полезными здесь. –
- 1. Подождите минуту перед запуском функции?
- 2. Несколько типов соединений DB
- 3. Gulp: Подождите, пока экспресс-сервер начнет работу перед запуском тестов.
- 4. YII2 Ajax Несколько соединений DB
- 5. Javascript - Подождите заданное время перед запуском скрипта только один раз
- 6. Android - Подождите, пока поток будет запущен перед запуском службы.
- 7. Javascript: Подождите несколько кадров перед продолжением функции
- 8. Подождите несколько событий перед продолжением (threadsafe)
- 9. Vim показывает несколько ошибок перед запуском
- 10. Проверка соединений Django DB на сервере запуска
- 11. Php, MySql - Несколько соединений DB и mysql_insert_id()
- 12. Несколько DB-соединений в Tomcat context.xml?
- 13. Несколько соединений Oracle DB с OracleDataSource
- 14. Настроить несколько соединений DB на ZF2
- 15. Db производительности: несколько соединений против присоединяется/подзапросы
- 16. Несколько соединений с DB и структура исполнителей
- 17. Azure SQL - одно или несколько соединений DB?
- 18. несколько соединений mysql db на zencart
- 19. Azure SQL, перед запуском?
- 20. Загрузка активности перед запуском
- 21. Подождите AsyncCallback перед продолжением
- 22. Лучший способ использовать git перед запуском rake db: migrate
- 23. Перед запуском onCreateView
- 24. Эхо перед запуском процесса
- 25. Скрипты исправления перед запуском
- 26. Остановить xcode перед запуском?
- 27. Создание/рендеринг Перед запуском
- 28. Программа заканчивается перед запуском?
- 29. Советы перед запуском проекта
- 30. Принесите симулятор перед запуском
Я не знаю о сервере Redis, но новое соединение с PostgreSQL занимает менее 100 мс, едва ли можно отложить начало приложения Express. Кроме того, приложение будет получать доступ к серверу асинхронно, так что эта логика избыточна. Взгляните на [pg-prom] (https://github.com/vitaly-t/pg-promise), он хорошо справляется с асинхронным доступом к Postgres. –
В моем случае сервер PostgreSQL и серверы Redis выполнялись на компьютерах в другом месте в Интернете, чем на экспресс-сервере, поэтому соединения иногда занимали чуть больше 100 мс. Даже если все они были на одном сервере, я думаю, я все равно буду беспокоиться о доступе к БД (например, в стартовом коде Express), который еще не был официально подключен. –