【发布时间】:2016-04-22 13:47:58
【问题描述】:
我创建了这个对象,其中包含一个数组,用作工作队列。
它的工作原理是这样的:
var work1 = new Work();
var work2 = new Work();
var queue = Workqueue.instance();
queue.add(work1) // Bluebird promise.
.then(function addWork2() {
return queue.add(work2);
})
.then(function toCommit() {
return queue.commit();
})
.then(function done(results) {
// obtain results here.
})
.catch(function(err){});
它适用于这种情况,我可以在调用提交之前提交多个任务。
但是如果是这样的话:
var work1 = new Work();
var work2 = new Work();
var queue = Workqueue.instance();
queue.add(work1)
.then(function toCommit1() {
return queue.commit();
})
.then(function done1(result1) {
// obtain result1 here.
})
.catch(function(err){});
queue.add(work2)
.then(function toCommit2() {
return queue.commit();
})
.then(function done2(result2) {
// obtain result2 here.
})
.catch(function(err){});
可能会出错,因为如果在第二次提交之后调用了第一次提交(已经添加了两个作品/任务),第一个提交处理程序期望一个结果,但它们都转到第二个提交处理程序。
该任务涉及Web SQL 数据库读取,也可能涉及网络访问。因此,这基本上是一个复杂的过程,因此上述问题可能会浮出水面。如果我可以实现一个addWorkAndCommit() 将add 和commit 包装在一起,但仍然不能保证,因为addWorkAndCommit() 在某种意义上不能是“原子的”,因为它们涉及异步调用。因此,即使两次调用addWorkAndCommit() 也可能会失败。 (我不知道如何用“原子”来描述它,因为 JavaScript 是单线程的,但是这个问题突然出现了)。
我能做什么?
【问题讨论】:
-
@BenjaminGruenbaum 我不知道如何在这个问题中实现它。
标签: javascript promise bluebird