JavaScript工作队列
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JavaScript工作队列,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1910字,纯文字阅读大概需要3分钟。
内容图文
![JavaScript工作队列](/upload/InfoBanner/zyjiaocheng/822/aa8a84fdd8d14daa981c5839154f4427.jpg)
我创建了这个包含数组的对象,该数组用作工作队列.
它有点像这样:
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是单线程的,但是这个问题就出现了).
我能做什么?
解决方法:
问题是存在commit()但没有事务的概念,因此您不能显式地并行运行两个独立的事务.根据我的理解,Javascript Workqueue是远程队列的代理,并且对add()和commit()的调用直接映射到具有类似接口而没有事务的某种远程过程调用.我也明白你不关心第二个add()是否真的发生在第一个commit()之后,你只想写两个简单的后续addWorkAndCommit()语句而不同步客户端代码中的底层调用.
您可以做的是在本地Workqueue周围编写一个包装器(如果它是您的代码,则直接更改它),这样队列的每次更新都会创建一个新事务,commit()总是引用一个这样的事务.然后,包装器会延迟新的更新,直到所有先前的事务都已提交(或回滚).
内容总结
以上是互联网集市为您收集整理的JavaScript工作队列全部内容,希望文章能够帮你解决JavaScript工作队列所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。