作者red0whale (red whale)
看板Ajax
标题[问题] 有没有办法强制停止正在执行中的JavaScript函数?
时间Sun May 22 15:00:30 2016
<script>
var fn = function(url){
// bla bla bla...
};
</script>
<input type="button" onclick="fn()" value="Execute">
<input type="button" onclick="???" value="Abort">
如上,当使用者按下“Execute”按钮时,“fn()”函数就会被执行。
假设fn()函数会执行很久,
如果使用者想在中途停止这个函数的执行(按“Abort”按钮),
请问我该怎麽做?
如果说“fn()”函数有哪些的话,就像AJAX或其他可能要跑很久的程式
当然,除了AJAX之外还有可能是其他哩哩抠抠的函数。
不管,反正就是要强制让该函数停止的方法为何?
----------
举下面这个例子:
<script>
var a = 0;
function fn(){
a++;
$("#num").text(a);
setTimeout("fn()", 10);
};
</script>
<div id="num"></div>
<input type="button" onclick="fn()" value="Execute">
<input type="button" onclick="???" value="Abort">
请问该如何让“fn()”函数停止,而且不能使用clearTimeout函数?
(目的是要让fn()函数能够整个强迫中止而非只是停止那个计数器而已)
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 101.139.104.211
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Ajax/M.1463900435.A.395.html
1F:→ Kenqr: 先检查某个变数为true时,再setTimeout05/22 16:05
2F:→ Kenqr: 按abort钮时就去改变那个变数的内容05/22 16:06
3F:推 mrbigmouth: 一定要使用timeout系列函数 否则fn执行中使用者是完05/22 16:17
4F:→ mrbigmouth: 全不可能做到任何事的 包括卷卷轴或点击按钮都不行05/22 16:17
5F:→ mrbigmouth: 画面会整个当掉 因为JavaScript是单执行绪的执行环境05/22 16:17
6F:→ mrbigmouth: 使用者永远只可能在fn执行一段落後才可能动作05/22 16:18
<script>
var a = 0;
function fn(){
a++;
$("#num").text(a);
setTimeout("fn()", 10);
};
</script>
<div id="num"></div>
<input type="button" onclick="fn()" value="Execute">
<input type="button" onclick="alert('Abort');" value="Abort">
如果像这样呢? 当fn()函数正在执行时,按下Abort钮一样可以显示警告视窗呀
为什麽会说整个画面会当掉呢?
谢谢
※ 编辑: red0whale (101.139.104.211), 05/22/2016 21:30:45
7F:推 eight0: fn() 并没有执行很久,而是执行「很多次」05/22 22:52
8F:→ eight0: Abort 并不是在 fn() 执行中被按下的,而是在两次 fn() 之05/22 22:53
9F:→ eight0: 间被按下的05/22 22:53
10F:→ eight0: fn() 和 setTimeout(fn) 的效果是不一样的05/22 22:55
11F:推 shadowjohn: 用 flag吧~true时可跑,false return掉05/22 23:28
12F:推 mrbigmouth: eight0说的没错 还有像ajax在发送出去到回来之间05/23 07:16
13F:→ mrbigmouth: function也是没在执行的05/23 07:16
14F:→ mrbigmouth: 所以能中间中断的function 只可能是setTime系列那种05/23 07:17
15F:→ mrbigmouth: 本身自己就不断中断不断执行的function 方法其他人说05/23 07:17
16F:→ mrbigmouth: 很多了 但你原本问的那种直接中断function是不允许的05/23 07:17
谢谢各位
那麽想请问一下,
如果没有办法直接中止function,
那有没有办法直接中止「目前function的步骤」?
例如fn包含很多程序(例如先执行ajax、再执行setTimeout、又再执行jquery的属性设定
等等)
有办法说在执行fn函数时,
强制停止该函数至某一步骤(阶段)吗?
换句话说,当使用者执行了fn函数後,
假设现在程式刚执行完ajax,
准备执行setTimeout,
好巧不巧这时使用者按下abort按钮,
请问有办法中止现在这函数的步骤吗?
另外,要怎麽知道函数现在正在执行ajax
(应该说要怎麽知道ajax才刚发送request,但还没success呢)
谢谢
※ 编辑: red0whale (101.139.104.211), 05/23/2016 07:57:11
17F:→ mirtac: 基本上是做不到的, 除非使用worker, 但要注意 worker中不 05/23 14:04
18F:→ mirtac: 能存取 dom , 还有较旧的browser不支援worker 05/23 14:04
19F:→ mrbigmouth: 自己用变数纪录现在在哪个步骤罗 05/23 16:30