Ответ 1
Главное, что следует помнить о promises, состоит в том, что then
возвращает новое обещание (как и catch
). Как будет достигнуто это новое обещание, зависит от того, что вы вернетесь из обработчика: если вы вернете обещание, новое обещание от then
/catch
подчинено тому, которое вы вернули; если вы вернете значение, новое обещание будет разрешено с этим значением.
Итак, вы можете связать их вместе. Подумайте о обработчиках then
и catch
в качестве трансформирующих фильтров, через которые проходит конечный результат.
Обратите внимание, что если у вас есть отправная точка, которая дает вам обещание (cn.connect()
), вам не нужно new Promise
: просто используйте then
и catch
, чтобы преобразовать то, что проходит через цепочку, возвращая (новое) значение разрешения.
Еще одна важная вещь, которую следует помнить, состоит в том, что если обработчик catch
возвращает значение, он преобразует отклонение в разрешение. Чтобы продолжить путь отклонения, обработчик catch
должен либо выбросить исключение, либо вернуть обещание, которое будет/будет отклонено.
Наконец: require
вызовы всегда должны быть в начале модуля.
Итак, не удаляя преобразование отказов в разрешения (подробнее об этом в один момент):
var sql = require('mssql');
var myDao = require('./myDao');
module.exports = {
dbConnection: function () {
return { user: 'sa', password: 'mypassword', server: 'localhost', database: 'mydb' };
},
CanIConnectToTheDB: function () {
var cn = new sql.ConnectionPool(myDao.dbConnection());
return cn.connect()
.then(function () {
var req = new sql.Request(cn);
var qry = 'select serverproperty(\'productversion\') as \'rs\'';
return req.query(qry)
.then(function (rs) {
qry = 'select isnull(object_id(\'SomeObjectIKnowExists\'), -1)';
return req.query(qry)
.then(function (rss) { // Note you're not using rss anywhere
return ' CONNECTED// MASTER DB SUCCESS// MY DB SUCCESS';
})
.catch(function (err) {
return ' CONNECTED// MASTER DB SUCCESS// ISSUE QUERYING MY DB //' + err + '//';
});
})
.catch(function (er) {
return ' CONNECTED// COULD NOT QUERY MASTER DB //' + er + '//';
});
})
.catch(function() {
return ' CAN NOT CONNECT';
});
}
};
Примечание. Я намерен НЕ использовать rej [ect] здесь. То, что вы видите guatanrees только res [olve] возвращается. Это означает, что для этого кода требуется только один путь для обработки возвращаемого значения. Таким образом, возвращаемый код в нем более упрощен.
Отклонения следуют по отдельному пути от разрешений по причине. Это не усложняет ситуацию, это упрощает работу. Не конвертируйте отклонения в разрешения, если вы не сделали какое-либо восстановление ошибок и можете продолжать, как будто отклонение не произошло.
Здесь этот код, в котором отклонениям разрешено быть отклонениями:
var sql = require('mssql');
var myDao = require('./myDao');
module.exports = {
dbConnection: function () {
return { user: 'sa', password: 'mypassword', server: 'localhost', database: 'mydb' };
},
CanIConnectToTheDB: function () {
var cn = new sql.ConnectionPool(myDao.dbConnection());
return cn.connect()
.then(function () {
var req = new sql.Request(cn);
var qry = 'select serverproperty(\'productversion\') as \'rs\'';
return req.query(qry)
.then(function (rs) {
qry = 'select isnull(object_id(\'SomeObjectIKnowExists\'), -1)';
return req.query(qry)
.then(function (rss) { // Note you're not using rss anywhere
return ' CONNECTED// MASTER DB SUCCESS// MY DB SUCCESS';
});
});
});
}
};
Используя его:
theModule.CanIConnectToTheDB()
.then(function() {
// Yes, let do something
})
.catch(function() {
// No, report the problem, etc.
});
Я также, возможно, абстрагирую бит, я предполагаю, что вы закончите работу снова и снова: установление соединения и получение от него объекта запроса:
var sql = require('mssql');
var myDao = require('./myDao');
function getRequest() {
var cn = new sql.ConnectionPool(myDao.dbConnection());
return cn.connect().then(function() {
return new sql.Request(cn);
});
}
module.exports = {
dbConnection: function () {
return { user: 'sa', password: 'mypassword', server: 'localhost', database: 'mydb' };
},
CanIConnectToTheDB: function () {
return getRequest().then(function(req) {
var qry = 'select serverproperty(\'productversion\') as \'rs\'';
return req.query(qry)
.then(function (rs) {
qry = 'select isnull(object_id(\'SomeObjectIKnowExists\'), -1)';
return req.query(qry)
.then(function (rss) { // Note you're not using rss anywhere
return ' CONNECTED// MASTER DB SUCCESS// MY DB SUCCESS';
});
});
});
}
};