Ste*_*eve 1 javascript node.js promise
任何人都可以建议一种更好的方法来构建Promises的使用吗?我对Promises很新,我想知道我是否遗漏了一些关于如何构建这一系列事件的东西.
注意:我打算不在这里使用rej [ect].你看到guatanrees只有res [olve]返回.这意味着返回的代码只需要一个路径来处理返回的值.因此返回的代码在它的流程中更简单.
如果您不认识它,可能会有所帮助,这取自我创建的模块.把它想象成道.
module.exports = {
dbConnection: function () {
return { user: 'sa', password: 'mypassword', server: 'localhost', database: 'mydb' };
},
CanIConnectToTheDB: function () {
return new Promise(function (res, rej) {
var sql = require('mssql');
var myDao = require('./myDao');
var cn = new sql.ConnectionPool(myDao.dbConnection());
cn.connect().then(function () {
var req = new sql.Request(cn);
var qry = 'select serverproperty(\'productversion\') as \'rs\'';
req.query(qry)
.then(function (rs) {
qry = 'select isnull(object_id(\'SomeObjectIKnowExists\'), -1)';
req.query(qry)
.then(function (rss) {
res(' CONNECTED// MASTER DB SUCCESS// MY DB SUCCESS');
})
.catch(function (err) {
res(' CONNECTED// MASTER DB SUCCESS// ISSUE QUERYING MY DB //' + err + '//');
});
})
.catch(function (er) {
res(' CONNECTED// COULD NOT QUERY MASTER DB //' + er + '//');
});
})
.catch(function () {
res(' CAN NOT CONNECT');
});
});
}
};
Run Code Online (Sandbox Code Playgroud)
而不是像这样的东西:
.then(function (rs) {
qry = '...';
req.query(qry)
.then(function (rss) {
Run Code Online (Sandbox Code Playgroud)
你可以使用这样的东西:
.then(function (rs) {
qry = '...';
return req.query(qry);
}).then(function (rss) {
Run Code Online (Sandbox Code Playgroud)
也就是说,你可以在一个then回调中返回一个promise,并在下一个回调中获得该promise的解析值then,这样你的缩进就会保持不变.
更简单的例子 - 而不是这个:
a().then(va => {
b(va).then(vb => {
c(vb).then(vc => {
// you can use vc here
});
});
});
Run Code Online (Sandbox Code Playgroud)
你可以做:
a().then(va => {
return b(va);
}).then(vb => {
return c(vb);
}).then(vc => {
// you can use vc here
});
Run Code Online (Sandbox Code Playgroud)
或者,如果您使用async和更简单await:
va = await a();
vb = await b(va);
vc = await c(vb);
// you can use vc here
Run Code Online (Sandbox Code Playgroud)
请注意,您只能在使用关键字await创建的函数内部使用async.在您没有本机支持的地方async,await您可以使用Babel或稍微不同的语法,基于生成器的方法,如in co或Bluebird协同程序.有关浏览器和节点的更多信息和支持,请参阅以下答案:
这没有经过测试,但这或多或少都是我写的:
module.exports = {
dbConnection: function () {
return { user: 'sa', password: 'mypassword', server: 'localhost', database: 'mydb' };
},
CanIConnectToTheDB: function () {
var sql = require('mssql');
var myDao = require('./myDao');
var cn = new sql.ConnectionPool(myDao.dbConnection());
var req;
return cn.connect()
.catch(err => Promise.reject('Error 1: ' + err))
.then(() => {
req = new sql.Request(cn);
var qry = 'select serverproperty(\'productversion\') as \'rs\'';
return req.query(qry)
.catch(err => Promise.reject('Error 2: ' + err));
}).then(rs => {
var qry = 'select isnull(object_id(\'SomeObjectIKnowExists\'), -1)';
return req.query(qry)
.catch(err => Promise.reject('Error 3: ' + err));
}).then(function (rss) {
return 'CONNECTED// MASTER DB SUCCESS// MY DB SUCCESS';
}).catch(err => {
// if you want it always resolved:
return 'CAN NOT CONNECT: ' + err;
});
}
};
Run Code Online (Sandbox Code Playgroud)
当然,我会保留该函数返回的最终承诺在错误时被拒绝,并且仅在成功时解决,但由于您在问题中明确包含了这个奇怪的要求,因此我按照您的意愿编写了它.
但如果它拒绝了任何错误的承诺,那么它将更容易使用,特别是如果你关心的只是函数名称中问题的答案 - 我可以连接到数据库:
CanIConnectToTheDB()
.then(() => console.log("Yes I can"))
.catch(() => console.log("No I can't"));
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅以下答案
| 归档时间: |
|
| 查看次数: |
292 次 |
| 最近记录: |