异步执行和onsuccess事件处理程序

时间:2016-02-21 21:38:17

标签: javascript asynchronous

在许多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(); }

2 个答案:

答案 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);
  }
}