2014-04-21 44 views
1

例如,您有一个Web音乐播放器应用程序。当用户点击播放按钮时,会触发一个功能,查找MP3数据,设置播放器等等,但是然后用户改变主意并点击另一首曲目上的播放。有没有办法完全取消前面的功能?我知道你可以放弃XHRequests,但我的意思是整个功能。也许JS承诺?如何中止JavaScript异步函数?

+1

取决于函数,但没有,你不能只是取消任何异步函数具有一些特殊的方法。 – adeneo

+1

没有办法'取消'一个功能。它必须是API的一部分。在你的例子中,它听起来像AJAX,你可以取消。 –

+0

您不能取消您已经完成的功能的结果。但是你的帖子中没有这个问题。只需重新构建你的模型。你不需要你所要求的。 –

回答

2

在JavaScript中的同步功能将运行至完成。它不会被其他用户操作中断。因此,在您的场景中,如果某个函数触发并正在设置播放器,则在处理下一个用户事件之前,该函数将运行至完成状态。所以,你不能在javascript中放弃一个同步函数,反正没有办法,因为(除了web worker,这里不是我们讨论的内容),javascript是单线程,只要函数正在运行,它会运行完成并且不会处理其他用户事件。

但是,如果该函数中有某种异步操作(例如通过ajax或加载音乐文件的播放器加载某些内容),那么是否可以中止异步操作是否可以中止,完全取决于特定的支持在那个操作中 - 没有通用的中止。为了帮助我们解决异步细节问题,您需要披露您的实际代码,以便我们看到您正在做的事情。

承诺是不是中止异步操作的工具。事实上,他们是一个相反的工具,因为他们报告异步操作发生的事情和时间。它们不会导致这些事情发生,然后在异步操作发生时才通知观察者。


如通常是StackOverflow的问题的情况下,我们可以帮助深入更多,如果您披露您的实际代码,因为这将您的问题从理论的讨论变成什么样的选择是对的实证分析你的实际代码。

+0

一些承诺库支持中止任务链。即使单个任务不提供放弃它们的API,它们的回调也可以取消。 – Bergi

+0

@Bergi - 不会自己放弃任务 - 只有完成通知。 – jfriend00

+1

当然,要中止当前正在运行的任务,该方法需要注册。然而,对于一系列任务(即使它们不能自行放弃)的承诺可以被取消,并且不会继续激发新的链环节(任务)。 – Bergi

相关问题