为什么在javascript延迟回调中不会创建竞争条件?

时间:2015-09-29 09:47:30

标签: javascript promise race-condition deferred deferred-execution

所以我想写一些类似于从IndexedDB文档中删除的内容:

var req;
var store = getStore();
req = store.count();
req.onsuccess = function(evt) {
  console.log("success: " + evt.result);
};
req.onerror = function(evt) {
  console.error("add error", this.error);
};

https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB

开始想知道为什么javascript允许在调用后定义(延迟?)回调以及为什么它不会导致竞争条件? 有人可以分享一些亮点吗?

那么,javascript如何确保在分配回调之前不会执行异步调用?

谢谢!

1 个答案:

答案 0 :(得分:3)

JS是单线程的,因此当前代码的实际执行顺序如下:

store.count();              // trigger some async code
req.onsuccess; req.onerror; // attach the callbacks
                            // some other code in the same function/scope may follow

                            // your code is finished; next item from event queue is executed

store.count();              // the async part gets executed
req.onsuccess();            // after the async part (or within it) 
                            // one of your callbacks gets executed.

所以你可以看到,当你附加你的回调时,只要你这样做,在当前函数完成之前并且JS事件队列寻找下一个要执行的代码块时,这并不重要。

关于你的评论:不,解析和执行时间在现代JS引擎中并不相同。引擎会编译您的代码然后执行它。 (有一些例外,其中使用了旧解释器样式的后备,但在大多数情况下这应该不相关)。