5

我正在启动一堆 indexeddb 操作,并希望它们能够在它们完成时增加一个计数器(并改变一些其他的东西,但是对于这个问题,假设它正在增加一个计数器)。我从IndexedDB 规范中知道它在不同的线程中运行回调(尽管有这样的措辞,但我不确定实现是否必须使用线程)。但是 AFAIK,JavaScript/HTML5 没有任何东西可以保证线程安全,所以我害怕以下情况:

/* Sequence involved in incrementing a variable "behind the scenes" */
//First callback calls i++; (it's 0 at this point)
load r0,[i]  ; load memory into reg 0

//Second callback calls i++ (it's still 0 at this point)
load r1,[i]  ; load memory into reg 1

//First callback's sequence continues and increments the temporary spot to 1
incr r0      ; increment reg 0

//Second callback's sequence continues and also increments the temporary spot to 1
incr r1      ; increment reg 1

//First callback sequence finishes, i === 1
stor [i],r0  ; store reg 0 back to memory


//Second callback sequence finishes, i === 1
stor [i],r1  ; store reg 1 back to memory

(或类似的规定)

那么我的选择是什么?我可以在每个调用的回调中生成网络工作者吗postMessage并且监听器增加它吗?就像是:

increment.js(我们的 Worker 的代码)

//Our count
var count = 0;

 function onmessage(event)
 {
    count += event.data;
 }

main.js

//Our "thread-safe" worker?
var incrementer = new Worker( "increment.js" );

//Success handler (has diff thread)
req.onsuccess = function(event) {  

    ...finish doing some work...

    //Increment it
    incrementer.postmessage( 1 );
};

那行得通吗?或者网络工作者的 onmessage 是否仍会出现在回调的线程中?有没有办法让它在全局线程中?

4

1 回答 1

7

引用文档中唯一提到“线程”一词的是 IndexedDB API 方法不会阻塞调用线程(但这仍然不意味着这些方法在单独的线程中运行,但它只是说明这些方法是本质上是异步的),但根本没有提到回调将在不同的线程中运行。

此外,JavaScript 本身是单线程的,因此您可以放心地假设回调将全部在同一个(“全局”)线程中运行,并且将按顺序调用,而不是同时调用。

所以不需要网络工作者,你可以直接从回调本身增加全局变量:

req.onsuccess = function(event) {  
  count += event.data;
};
于 2013-06-15T09:10:28.850 回答