useConfirm.ts 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. export function useConfirm() {
  2. const confirm = (options) => {
  3. return new Promise((resolve, reject) => {
  4. // 唯一ID,彻底隔离每个弹窗
  5. const eventId = Date.now() + '_' + Math.random().toString(36).substr(2, 9)
  6. const resultEvent = `confirmResult_${eventId}`
  7. let isFinished = false
  8. let timeoutTimer = null
  9. // 接收结果
  10. const handleResult = (result) => {
  11. if (isFinished) return
  12. isFinished = true
  13. clearTimeout(timeoutTimer)
  14. uni.$off(resultEvent, handleResult)
  15. if (result) resolve(true)
  16. else reject(new Error('cancel'))
  17. }
  18. // 监听自己的结果
  19. uni.$on(resultEvent, handleResult)
  20. // 打开全局弹窗
  21. uni.$emit('showConfirm', {
  22. ...options,
  23. eventId
  24. })
  25. // 超时保护
  26. timeoutTimer = setTimeout(() => {
  27. if (isFinished) return
  28. isFinished = true
  29. uni.$off(resultEvent, handleResult)
  30. reject(new Error('timeout'))
  31. }, 60000)
  32. })
  33. }
  34. return confirm
  35. }