在许多js示例中,我看到调用函数执行异步任务,例如:
var objectStoreTitleRequest = objectStore.get(title);
objectStoreTitleRequest.onsuccess = function() {
// Grab the data object returned as the result
var data = objectStoreTitleRequest.result;
}
(此示例基于https://developer.mozilla.org/en-US/docs/Web/API/IDBRequest/onsuccess)
我想知道如果在设置onsuccess处理程序之前完成异步执行,这是如何工作的。我希望在执行异步函数之前添加事件处理程序,但所有js示例在调用之后添加处理程序(在本例中为get())。这是如何内部解决的?我如何实现提供类似API的自定义对象?我认为这必须像
{self.result = do_work(); wait for onsuccess handler is set...; if handler_avail -> self.onsuccess(); }
答案 0 :(得分:0)
因为Javascript是严格的单线程,所以异步操作只能在其他代码运行完毕后运行它们的回调。
因此,请求不可能在两行之间完成。
答案 1 :(得分:0)
这正是永远不会同步调用回调函数/事件处理程序的原因。
例如,以下代码错误:
function async(val, cb) {
if(val < 0) {
cb();
}
else {
setTimeout(cb, val);
}
}
而必须的实现类似于:
function async(val, cb) {
if(val < 0) {
setTimeout(cb, 0);
}
else {
setTimeout(cb, val);
}
}