1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
Скрыть объявление

Привет посетитель! У нас на форуме тебе откроются дополнительные разделы, которые скрыты от гостей! А так же ты найдёшь много полезной информации.

[JS] NeDB дождаться выполнения колбэка

Тема в разделе "PHP / Python / JavaScript / Etc", создана пользователем Daan Raven, 17 апр 2017.

  1. Daan Raven

    Daan Raven Свой человек Проверенный

    Регистрация:
    7 апр 2015
    Сообщения:
    722
    Симпатии:
    328
    Баллы:
    469
    В общем при разработке приложеньки столкнулся с одной проблемой. В проекте использую React и NeDB. Фишка в том, что в NeDB все функции выполняются асинхронно и в момент получения результата функция-колбэк еще выполняется, то есть полноценный результат возвращается уже после отрисовки изменений DOM-дерева. Мне же нужно дождаться, пока функция выполнится, чтобы затем отобразить результат на странице.
    Вот функция, которая используется для получения всех документов из БД:
    Код:
    export function getAllQuestions() {
      let questionList = [];
      window.questions.find({}, function (err, docs) {
        docs.forEach((value) => {
          questionList.push(value.name);
          console.log(value);
        }, this);
      });
    
      return questionList;
    }
    
    Затем в компоненте в функции render я сначала получаю результат:
    Код:
    const questionList = getAllQuestions();
    А затем собственно возвращаю React-элемент.
    Проблема кроется именно в колбэке:
    Код:
    function (err, docs) {
        docs.forEach((value) => {
          questionList.push(value.name);
          console.log(value);
        }, this);
      }
    
    Как дождаться его выполнения, а затем вернуть результат?
     
  2. Daan Raven

    Daan Raven Свой человек Проверенный

    Регистрация:
    7 апр 2015
    Сообщения:
    722
    Симпатии:
    328
    Баллы:
    469
    В общем забил болт на это, теперь внутри колбэка меняю состояние компонента:
    Код:
          window.subjects.insert({name: subjectName}, (err, newDoc) => {
            if (err)
              console.err(err.message);
            this.setState({activeModal: questionsModals.NONE});
          });
    
     
    kick нравится это.