Как предотвратить зависание вложенного обещания?

#javascript #promise #bluebird

#javascript #обещание #bluebird

Вопрос:

Следующий код работает (пользовательский объект записывается в консоль), однако процесс не завершается. Я считаю, что одно из обещаний не должно быть разрешено?

 var Promise = require("bluebird");
var mongodb = require('mongodb');

Promise.promisifyAll(mongodb);

mongodb.MongoClient.connectAsync("mongodb://localhost/test")
.then(function(db){
    var users = db.collection('users');
    return users.findOneAsync({userName: "someuser"});
})
.then(function (result) {
    console.log(result);
})
.catch(function(e){
    //handle error
});
  

Что не так с этим кодом?

Комментарии:

1. Если вы что-то печатаете, то обещания определенно разрешаются. Есть ли причина не добавлять .finally(function() {process.exit(0);}) для завершения работы скрипта, когда вы закончите?

2. Закрытие соединения, как предложено в ответе ниже, приводит к чистому завершению кода.

Ответ №1:

MongoDB создает постоянное соединение, которое вы должны использовать в течение всего жизненного цикла вашего приложения.

Когда вы закончите с этим — закройте его. То есть — вызов db.close()

Если вы хотите написать более разумный код, используйте Promise.using и disposer для создания более разумного connectAsync кода, который выполняет управление ресурсами за вас.