-2

Недавно программирую под нодой и вот столкнулся с асинхронностью.

Проблема такая:
есть у меня модуль, который экспортирует функцию для работы с БД, а перед функцией идет настройка бд.
Настройка происходит асинхронными запросами + с участием человека.

И вот тут возникает проблема:
экспортируемая функция должна работать с уже настроенной БД, а т.к. настройка асинхронная, то первый вызов функции происходит раньше конца настройки.

Не знаю как лучше описать, а код выложить не могу.

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

Как это можно сделать? И желательно без сторонних библиотек.

Grundy
  • 81,538
Artur
  • 11
  • Гуглите по слову "Promise". – Yaant Nov 08 '16 at 11:24
  • 2
    Без кода - вопрос лишен смысла. Не можете выложить реальный код - используйте специально выдуманный пример. Иначе разговор ни о чем – Dmitriy Simushev Nov 08 '16 at 11:30

1 Answers1

-1

Простейший вариант:

var client,queue=[];
db.connect('protocol://user:password@server/database', function(err,conn){
    if(err)return console.error(err);
    connection=conn;
    for(var i in queue){
        query(queue[i].input,queue[i].cb)
    }
});

function query(input,callback){
    if(typeof input=='string')input={query:input};
    if(!connection)queue.push({input:input,cb:callback});
    else connection.query(input.query, input.data||[], callback);
}

Пока не поднимется connection - все запросы будут собираться в массив queue. Когда connection случится - все запросы из очереди можно будет выполнить.

Darth
  • 13,217
  • А если подключение не удалось - очередь будет копиться вечно? – Pavel Mayorov Nov 08 '16 at 12:25
  • Вот потому обещания и нужны, что с ними такой ошибки не допустить. – Pavel Mayorov Nov 08 '16 at 12:25
  • Обещания - всего лишь синтаксический сахар. С ними новичок быстрей допустит ошибку, чем без них. Если подключение не удалось - это отдельный случай, не связанный с вопросом. – Darth Nov 08 '16 at 13:03
  • Нет, это не сахар, это абстракция. Они, к примеру, избавляют от очереди. И позволяют обработать ошибку при неудавшемся подключении. – Pavel Mayorov Nov 08 '16 at 13:06
  • Я что то не вижу вашего ответа, одну только критику – Darth Nov 08 '16 at 13:11
  • Во-первых, мой ответ есть по ссылке в комментариях. Во-вторых, наличие своего ответа не является обязательным требованием для критики. – Pavel Mayorov Nov 08 '16 at 13:12