Сегодня я потратил довольно много времени, пытаясь понять, почему мои промисы Javascript не работают. После долгого замешательства я наконец понял, что проблема была не в моем Javascript, а в моей базе данных!

Приложение, над которым я работаю, использует MongoDB и Mongoose.js для упрощения моделирования. И, оказывается, API Mongoose автоматически возвращает промисы в качестве результатов запросов к базе данных. Это имеет смысл, учитывая, что для выполнения запросов к базе данных требуется время. Возвращая обещание, API Mongoose соблюдает соглашения об асинхронности Javascript, позволяя остальной части программы продолжать работу, пока Mongoose собирает данные с сервера.

Кроме того, я не хотел, чтобы мое приложение продвигалось дальше. Мой серверный код пытался создать новую запись, но для этого ему требовались данные, которые Mongoose извлекал. Значит, надо было подождать. Я использовал соглашение Javascript .then() для цепочки событий, предотвращая запуск программы без необходимых данных.

К сожалению для меня, я не понимал, что Mongoose делает часть этой работы за меня, поэтому я потратил время на реализацию промисов самостоятельно. Только после того, как я понял, что Mongoose автоматически возвращает промисы из своих запросов, я смог заставить свой код работать.

Вот пример кода, который у меня получился:

// retrieve an attribute in order to create a new Record
var attributePromise =
Key.findOne({ myKey })
  .then((myKey) => {
    return myKey.attribute;
  });
// pass the new attribute from attributePromise
attributePromise.then((attribute) => {
  // create the new record
  let record = new Record({
    attribute: attribute
  });
  // save the new record
  record.save(function(err, record) {
    if (err) {
      console.log(err);
      });
    }
  });
});

Вы работали с MongoDB и Mongoose? Каким приемам вы научились успешно обрабатывать обращения к базе данных при работе с асинхронным Javascript?