Der*_*cni 8 node.js promise pg-promise
我是node.js的新手,pg-promise来自同步编程背景,需要一种新思维.
我将首先介绍在主程序逻辑之前运行数据库初始化的场景.
以下示例:https: //github.com/vitaly-t/pg-promise/wiki/Learn-by-Example#simple-select
db.any("select * from users where active=$1", [true])
.then(function (data) {
// success;
})
.catch(function (error) {
// error;
});
Run Code Online (Sandbox Code Playgroud)
我的代码是否应该是:
db.query("DELETE FROM records")
.then(function (data) {
// success;
console.log("This is where all my main logic goes");
})
.catch(function (error) {
// error;
});
Run Code Online (Sandbox Code Playgroud)
或者它会读作:
db.query("DELETE FROM records")
.then(function (data) {
// success;
})
.catch(function (error) {
// error;
});
console.log("This is where all my main logic goes");
Run Code Online (Sandbox Code Playgroud)
我的理解是,对于后者,将在删除记录之前显示消息.
更新: 在阅读了许多有关承诺和回调的文章后,我理解pg-promise使用链接.then和.catch来表示成功和错误情况.我现在也相信我理解pg-promise命令应该放在一个函数包装器中,例如:
function initialiseDB() {
db.query("DELETE FROM records")
.then(function (data) {
// success;
})
.catch(function (error) {
// error;
});
}
Run Code Online (Sandbox Code Playgroud)
然后从我的代码中我将使用一个简单的命令调用该函数,该命令将异步运行该函数:
initialiseDB();
Run Code Online (Sandbox Code Playgroud)
然而,我仍然不确定这种异步编码和承诺的概念如何适合程序的整体结构,因为程序中的几乎所有内容都需要首先完成初始化.因此,整个程序不需要放在函数的".then"部分吗?即顶层唯一的代码实际上是intialiseDB()函数?
// Start of code here
var pgp = require('pg-promise')();
//Configure the database connection
var config = {
user: 'username', //env var: PGUSER
database: 'database', //env var: PGDATABASE
password: 'password', //env var: PGPASSWORD
};
var db = pgp(config);
function initialiseDB() {
db.query("DELETE FROM records")
.then(function (data) {
// This is where the main program logic goes after this line;
})
.catch(function (error) {
// error;
});
}
// Commence the program here
initialiseDB();
Run Code Online (Sandbox Code Playgroud)
generatorsPG Promise 实际上允许在较新的 Nodejs 版本上使用async/await。Generators需要一个适配器,其承诺必须内置到系统中,因此提供一个适配器generator function将允许以同步方式实现更清晰的代码流
没有generators:
db.task(t => {
// this.ctx = task config + state context;
return t.one('SELECT * FROM users WHERE id = $1', 123)
.then(user => {
return t.any('SELECT * FROM events WHERE login = $1',user.name);
});
})
.then(events => {
// success;
})
.catch(error => {
// error;
});
Run Code Online (Sandbox Code Playgroud)
和generators:
db.task(function * (t) {
// this.ctx = task config + state context;
let user = yield t.one('SELECT * FROM users WHERE id = $1', 123);
return yield t.any('SELECT * FROM events WHERE login = $1', user.name);
})
.then(events => {
// success;
})
.catch(error => {
// error
});
Run Code Online (Sandbox Code Playgroud)
如果使用async/await,您可以简单地替换function * (t)withasync function (t)和yieldwith await,它的工作原理大致相同。
一些注意事项:
在更复杂的逻辑中,您应该在可能失败的事情周围使用 try catch 块,因为它们会将错误冒泡在generators和async/await
db.task(function * (t) {
yield Promise.reject(new Error('This will cause your app to error')
}
Run Code Online (Sandbox Code Playgroud)
你还应该密切关注他的 pg-promise 演示!它将教您一些很棒的东西,比如扩展事件、存储库、外部 SQL 文件,以及库中的许多其他很棒的东西,比如助手!
| 归档时间: |
|
| 查看次数: |
1658 次 |
| 最近记录: |