修复可能导致无法操作任务的问题

pull/225/head
lyswhut 2020-04-29 23:34:24 +08:00
parent 015c17e2dc
commit 12c370d7cb
2 changed files with 47 additions and 45 deletions

View File

@ -75,11 +75,11 @@ const awaitRequestAnimationFrame = () => new Promise(resolve => window.requestAn
const addTasks = async(store, list, type) => { const addTasks = async(store, list, type) => {
if (list.length == 0) return if (list.length == 0) return
let num = 5 let num = 3
while (num-- > 0) { while (num-- > 0) {
let item = list.shift() let item = list.shift()
if (!item) return if (!item) return
await store.dispatch('createDownload', { store.dispatch('createDownload', {
musicInfo: item, musicInfo: item,
type: getMusicType(item, type), type: getMusicType(item, type),
}) })
@ -88,20 +88,20 @@ const addTasks = async(store, list, type) => {
await addTasks(store, list, type) await addTasks(store, list, type)
} }
const removeTasks = async(store, list) => { const removeTasks = async(store, list) => {
let num = 50 let num = 20
while (num-- > 0) { while (num-- > 0) {
let item = list.pop() let item = list.pop()
if (!item) return if (!item) return
let index = store.state.list.indexOf(item) let index = store.state.list.indexOf(item)
if (index < 0) continue if (index < 0) continue
await store.dispatch('removeTask', index) store.dispatch('removeTask', item)
} }
await awaitRequestAnimationFrame() await awaitRequestAnimationFrame()
await removeTasks(store, list) await removeTasks(store, list)
} }
const startTasks = async(store, list) => { const startTasks = async(store, list) => {
let num = 10 let num = 5
while (num-- > 0) { while (num-- > 0) {
let item = list.shift() let item = list.shift()
if (!item) return if (!item) return
@ -115,13 +115,13 @@ const startTasks = async(store, list) => {
} }
const pauseTasks = async(store, list, runs = []) => { const pauseTasks = async(store, list, runs = []) => {
let num = 10 let num = 6
let index let index
let stateList = store.state.list let stateList = store.state.list
while (num-- > 0) { while (num-- > 0) {
let item = list.shift() let item = list.shift()
if (item.isComplate) continue
if (item) { if (item) {
if (item.isComplate) continue
switch (item.status) { switch (item.status) {
case state.downloadStatus.RUN: case state.downloadStatus.RUN:
runs.push(item) runs.push(item)
@ -129,7 +129,7 @@ const pauseTasks = async(store, list, runs = []) => {
case state.downloadStatus.WAITING: case state.downloadStatus.WAITING:
index = stateList.indexOf(item) index = stateList.indexOf(item)
if (index < 0) return if (index < 0) return
await store.dispatch('pauseTask', index) store.dispatch('pauseTask', item)
continue continue
default: default:
continue continue
@ -138,8 +138,9 @@ const pauseTasks = async(store, list, runs = []) => {
for (const item of runs) { for (const item of runs) {
index = stateList.indexOf(item) index = stateList.indexOf(item)
if (index < 0) return if (index < 0) return
await store.dispatch('pauseTask', index) await store.dispatch('pauseTask', item)
} }
return
} }
} }
await awaitRequestAnimationFrame() await awaitRequestAnimationFrame()
@ -276,12 +277,12 @@ const actions = {
dispatch('startTask', downloadInfo) dispatch('startTask', downloadInfo)
} }
}, },
async createDownloadMultiple(store, { list, type }) { createDownloadMultiple(store, { list, type }) {
if (!list.length) return if (!list.length || isRuningActionTask) return
if (isRuningActionTask) return
isRuningActionTask = true isRuningActionTask = true
await addTasks(store, [...list], type) return addTasks(store, [...list], type).finally(() => {
isRuningActionTask = false isRuningActionTask = false
})
}, },
async handleStartTask({ commit, dispatch, rootState }, downloadInfo) { async handleStartTask({ commit, dispatch, rootState }, downloadInfo) {
// 开始任务 // 开始任务
@ -368,39 +369,39 @@ const actions = {
dispatch('startTask') dispatch('startTask')
}) })
}, },
async removeTask({ commit, state, dispatch }, index) { async removeTask({ commit, state, dispatch }, item) {
let info = state.list[index] if (dls[item.key]) {
if (dls[info.key]) { if (item.status == state.downloadStatus.RUN) {
if (info.status == state.downloadStatus.RUN) {
try { try {
await dls[info.key].stop() await dls[item.key].stop()
} catch (_) {} } catch (_) {}
} }
delete dls[info.key] delete dls[item.key]
} }
commit('removeTask', index) commit('removeTask', item)
if (info.status != state.downloadStatus.COMPLETED) { if (item.status != state.downloadStatus.COMPLETED) {
try { try {
await deleteFile(info.filePath) await deleteFile(item.filePath)
} catch (_) {} } catch (_) {}
} }
switch (info.status) { switch (item.status) {
case state.downloadStatus.RUN: case state.downloadStatus.RUN:
case state.downloadStatus.WAITING: case state.downloadStatus.WAITING:
await dispatch('startTask') await dispatch('startTask')
} }
}, },
async removeTasks(store, list) { removeTasks(store, list) {
let { rootState, state } = store let { rootState, state } = store
if (isRuningActionTask) return if (isRuningActionTask) return
isRuningActionTask = true isRuningActionTask = true
await removeTasks(store, [...list]) return removeTasks(store, [...list]).finally(() => {
let result = getStartTask(state.list, state.downloadStatus, rootState.setting.download.maxDownloadNum) let result = getStartTask(state.list, state.downloadStatus, rootState.setting.download.maxDownloadNum)
while (result) { while (result) {
store.dispatch('startTask', result) store.dispatch('startTask', result)
result = getStartTask(state.list, state.downloadStatus, rootState.setting.download.maxDownloadNum) result = getStartTask(state.list, state.downloadStatus, rootState.setting.download.maxDownloadNum)
} }
isRuningActionTask = false isRuningActionTask = false
})
}, },
async startTask({ state, rootState, commit, dispatch }, downloadInfo) { async startTask({ state, rootState, commit, dispatch }, downloadInfo) {
// 检查是否可以开始任务 // 检查是否可以开始任务
@ -426,14 +427,14 @@ const actions = {
await dispatch('handleStartTask', downloadInfo) await dispatch('handleStartTask', downloadInfo)
} }
}, },
async startTasks(store, list) { startTasks(store, list) {
if (isRuningActionTask) return if (isRuningActionTask) return
isRuningActionTask = true isRuningActionTask = true
await startTasks(store, [...list]) return startTasks(store, [...list]).finally(() => {
isRuningActionTask = false isRuningActionTask = false
})
}, },
async pauseTask({ state, commit }, index) { async pauseTask(store, item) {
let item = state.list[index]
if (item.isComplate) return if (item.isComplate) return
let dl = dls[item.key] let dl = dls[item.key]
if (dl) { if (dl) {
@ -441,13 +442,14 @@ const actions = {
await dl.stop() await dl.stop()
} catch (_) {} } catch (_) {}
} }
commit('pauseTask', item) store.commit('pauseTask', item)
}, },
async pauseTasks(store, list) { pauseTasks(store, list) {
if (isRuningActionTask) return if (isRuningActionTask) return
isRuningActionTask = true isRuningActionTask = true
await pauseTasks(store, [...list]) return pauseTasks(store, [...list]).finally(() => {
isRuningActionTask = false isRuningActionTask = false
})
}, },
} }
@ -456,8 +458,8 @@ const mutations = {
addTask(state, downloadInfo) { addTask(state, downloadInfo) {
state.list.unshift(downloadInfo) state.list.unshift(downloadInfo)
}, },
removeTask(state, index) { removeTask({ list }, downloadInfo) {
state.list.splice(index, 1) list.splice(list.indexOf(downloadInfo), 1)
}, },
pauseTask(state, downloadInfo) { pauseTask(state, downloadInfo) {
downloadInfo.status = state.downloadStatus.PAUSE downloadInfo.status = state.downloadStatus.PAUSE

View File

@ -257,10 +257,10 @@ export default {
this.startTask(item) this.startTask(item)
break break
case 'pause': case 'pause':
this.pauseTask(index) this.pauseTask(item)
break break
case 'remove': case 'remove':
this.removeTask(index) this.removeTask(item)
break break
case 'file': case 'file':
this.handleOpenFolder(index) this.handleOpenFolder(index)