【问题标题】:What happens to code after history.back()?history.back() 之后的代码会发生什么?
【发布时间】:2014-10-21 23:26:13
【问题描述】:

我有如下代码:

window.history.back();
myFunction(10);
  • history.back() 是阻塞/非阻塞调用吗?

  • 是否保证myFunction() 将被执行?还是不会被执行?

  • 这是一个可能的竞争条件,history.back() 异步发生并且 是否调用myFunction()取决于不可控事件的时间?

【问题讨论】:

  • 有趣的问题,但是您对此事有何经验?你自己试过吗?
  • 这是个好问题!如果BeforeUnloadEvent 至少取消导航,则可以调用读取the specmyFunction
  • @Peter 函数运行;但是我想确定。
  • @teddbytee,当然:好问题,但作为额外信息,您自己在这件事上的经历总是很有趣

标签: javascript asynchronous concurrency


【解决方案1】:

spec 表示 history.back queues a task

因此,实际的历史操作代码(在 JS 实现内部)将在下次运行主 event loop 期间执行。您对myFunction 的调用在当前执行轮次中同步执行,因此它将始终在合规环境中执行。

但是,只有myFunction 中的同步代码才能保证执行。考虑这个例子:

function myFunction() {
  console.log('synchronous');
  debugger

  setTimeout(function() {
    console.log('async');
    debugger
  })
}

window.history.back();
myFunction();

第一个调试器语句总是被命中。第二个(使用setTimeout 推迟到未来的事件循环滴答声)不会。

This article 很好地解释了 JavaScript 事件循环

【讨论】:

  • 我在运行 android 6 API 23 的设备上的 chrome 40.0.0.0 中发现了一个例外。history.back() 之后的代码不执行。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
相关资源
最近更新 更多