我得到的输出正确,实际上,这两个操作被视为一个事务单元;如果一个失败,那么两个都会失败。
在此代码示例中:我正在进行以下交易
(1)插入(2)更新
我的处理方式是将数据库操作嵌套在.then内。我的问题是该代码是否偶然正确?我是Promise和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
});
这行得通,但是我觉得我仍然在做错事。寻找评论。
您需要从内部查询中返回一个Promise,以便将外链与此链接在一起。
您还会吞下任何错误,因为您不会重新抛出它们-最好使用.catch()
这个原因,因为这样可以使发生的事情更加清晰-这就是正常try- catch
语句会发生的情况。
knex.transaction(function(t) {
return knex('foo')
.transacting(t)
.insert({id:"asdfk", username:"barry", email:"barry@bar.com"})
.then(function() {
return knex('foo')
.where('username','=','bob')
.update({email:"bob@foo.com"});
})
.then(t.commit)
.catch(function(e) {
t.rollback();
throw e;
})
})
.then(function() {
// it worked
})
.catch(function(e) {
// it failed
});
为了更好地理解它,下面是被“模拟”的同步版本:
try {
var t = knex.transaction();
try {
knex("foo")
.transacting(t)
.insert({id:"asdfk", username:"barry", email:"barry@bar.com"});
knex("foo")
.where('username','=','bob')
.update({email:"bob@foo.com"});
t.commit();
}
catch (e) {
t.rollback();
// As you can see, if you don't rethrow here
// the outer catch is never triggered
throw e;
}
// It worked
}
catch (e) {
//It failed
}
问题内容: 我有一个名为PaymentStrategy的服务,已注入我的控制器中。 paymentStrategy中的这种购买方法会触发几种需要顺序调用的方法。当buy()中的所有方法都完成后,需要调用then()。 这可能是微不足道的,但我对棱角还很陌生。 目前,在init()方法之后立即触发buy()。then()。我觉得我们需要将所有这些方法放在一个promise中,并应用$ q.all()
问题内容: 用诺言做诸如while循环之类的事情的惯用方式是什么。所以: 如果条件仍然存在,请执行某项操作,然后再次重复执行其他操作。 我这样做是想知道是否有更好/更理想的方法? 输出:1 2 3 4 5 6 7 8 9 10 11完成 问题答案: 我会用一个对象包装值。这样,您可以拥有一个属性来让循环知道您已完成。
问题内容: 我对诺言不太熟悉。我想从承诺电话中隐藏承诺的实现。 例: 然后我将在同一文件中而不是在同一函数中解决我的诺言,我称其为诺言。 现在,我知道“ promiseFriend”是不确定的。我如何才能将承诺电话与承诺解决方案区分开? 问题答案: 如果要在函数中定义一个promise并在其他地方使用它,则首先需要从该函数返回promise,而您在代码中没有这样做。然后,您需要实际调用您也没有执行
问题内容: 关于这两个重要来源:NZakas- 承诺链中的归还承诺 和MDN承诺,我想提出以下问题: 每次我们从承诺履行处理程序返回值时,该值如何传递给从同一处理程序返回的新承诺? 例如, 在这个例子中,是一个承诺。也是来自履行处理程序的承诺。但是。取而代之的是神奇地解决(如何?),然后将该值传递给的实现处理程序。即使是这里的句子也令人困惑。 您能给我解释一下这到底是怎么回事吗?我对这个概念感到困
问题内容: AngularJS文档说: $ qpromise由模板引擎以角度识别,这意味着在模板中,您可以将附加到作用域的promise视为它们的结果值。 所以有人可以解释一下这种提琴无法正常工作的原因吗?不可能更改文本字段的值。但是分配保证$http服务返回作用域字段的工作就像一个超级按钮。 控制器: HTML: 问题答案: 您需要在promise对象上使用then()函数: 就您而言,我认为您
Promises是一种在JavaScript中实现异步编程的简洁方法(ES6新功能)。 在承诺之前,Callbacks用于实现异步编程。 让我们首先了解异步编程及其实现,使用Callbacks。 了解回调 函数可以作为参数传递给另一个函数。 这种机制被称为Callback 。 回调对事件有帮助。 以下示例将帮助我们更好地理解这一概念。 <script> function notifyA