Сегодня я потратил довольно много времени, пытаясь понять, почему мои промисы 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?