【问题标题】:Asynchronous execution and onsuccess event handler [duplicate]异步执行和onsuccess事件处理程序[重复]
【发布时间】:2016-02-22 05:46:58
【问题描述】:

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

【问题讨论】:

    标签: javascript asynchronous


    【解决方案1】:

    由于 Javascript 是严格的单线程,异步操作只能在其他代码运行完毕后运行它们的回调。

    因此,请求不可能在两行之间完成。

    【讨论】:

    • developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/get [...]IDBObjectStore 接口的get() 方法返回一个IDBRequest 对象,并在单独的线程中返回由指定键选择的对象存储。[.. .] 如果是严格的单线程,为什么要在这个时候引入线程?
    • 那个文档写得不好;它们实际上是异步的。 (实现是单独线程中的本机 C 代码,但这不相关)
    • 您能否提供一个示例,如何编写一个调用 onsuccess 处理程序(如果已设置)的异步函数?如果下面的代码仍然等待异步执行,我不明白为什么它被命名为异步。
    【解决方案2】:

    这正是您应该永远不要同步调用回调函数/事件处理程序的原因。

    例如下面的代码是错误的:

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

    【讨论】:

      猜你喜欢
      • 2014-01-15
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多