为什么在 javascript 中延迟回调不会创建竞争条件?
Why in javascript deferred callbacks don't create race conditions?
所以我想写一些类似于从 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 如何确保在分配回调之前不会执行异步调用?
谢谢!
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 引擎中的解析和执行时间并不相同。引擎会编译您的代码,然后执行它。 (有一些例外,使用旧解释器样式的回退,但在大多数情况下这不相关)。
所以我想写一些类似于从 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 如何确保在分配回调之前不会执行异步调用?
谢谢!
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 引擎中的解析和执行时间并不相同。引擎会编译您的代码,然后执行它。 (有一些例外,使用旧解释器样式的回退,但在大多数情况下这不相关)。