我得到了正确的输出,实际上,这两个操作被视为单个事务单元; 如果一个失败,两个都失败了.
在这个代码示例中:我正在做一个事务
(1)插入(2)更新
我接近它的方法是将我的数据库操作嵌套在.then中.我的问题是,这个代码是偶然的吗?我是承诺和knex的新手.
knex.transaction(function(t) {
knex('foo')
.transacting(t)
.insert({id:"asdfk", username:"barry", email:"barry@bar.com"})
.then(function() {
knex('foo')
.where('username','=','bob')
.update({email:"bob@foo.com"})
.then(t.commit, t.rollback)
})
})
.then(function() {
// it worked
},
function() {
// it failed
});
Run Code Online (Sandbox Code Playgroud)
这有效,但我觉得我还在做错事.寻找意见.
我正在尝试使用Bluebird库为Node.js包围承诺.
下面是一个简单的例子,它不能像我期望的那样工作.
var Promise = require("bluebird");
var myObj = {
add: function(op1, op2) {
return op1 + op2;
}
};
// Sync call to add method -> 7
console.log(myObj.add(3,4));
var myObjAsync = Promise.promisifyAll(myObj);
// Async call to promisified add method -> nothing written to console
myObjAsync.addAsync(2,3).then(function(data) {
console.log(data);
return data;
})
Run Code Online (Sandbox Code Playgroud)
我要么错过承诺或蓝鸟的一些(主要)概念.
在此先感谢您的帮助.
编辑:根据jfriend00的反馈修改(现在的工作版本).
var Promise = require("bluebird");
var myObj = {
add: function(op1, op2) {
return op1 + op2;
}
, add2: function(op1, op2, callback) { …Run Code Online (Sandbox Code Playgroud) 我正在测试使用此模块驱动ES7异步/等待提议来模拟它.我正在尝试让knex.js交易与他们合作,作为一个起点.
示例代码:
async function transaction() {
return new Promise(function(resolve, reject){
knex.transaction(function(err, result){
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
}
// Start transaction from this call
insert: async (function(db, data) {
const trx = await(transaction());
const idUser = await(user.insertData(trx, data));
return {
idCidUserstomer: idUser
}
})
Run Code Online (Sandbox Code Playgroud)
如何commit()或rollback()如果交易成功或失败?
node.js ×2
async-await ×1
bluebird ×1
database ×1
javascript ×1
knex.js ×1
promise ×1
transactions ×1