2014-04-21 39 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

相關問題