e65405b867e1a61182f47e7e9c1b2e42c670ab25.svn-base 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import axios from 'axios'
  2. import * as db from '../core/db'
  3. import ReqEvent from '../core/Event'
  4. const store = {}
  5. const geos = []
  6. const getData = (() => {
  7. let joinKeys = []
  8. let urlTemplate = 'http://www.4dage.com/4DMap/data/{z}_{x}_{y}.json'
  9. let subdomains = ['a', 'b', 'c', 'd']
  10. let index = 0
  11. let requestings = []
  12. let event = new ReqEvent()
  13. async function ajaxGetData(key, url) {
  14. let index = requestings.indexOf(key)
  15. if (~index) {
  16. return new Promise((resolve, reject) => {
  17. event.once(key, (data, error) => {
  18. if (error) {
  19. reject(error)
  20. } else {
  21. data.data && (data.data.__once = false)
  22. resolve(data)
  23. }
  24. })
  25. })
  26. } else {
  27. requestings.push(key)
  28. function result(res, err) {
  29. if (err) {
  30. event.emit(key, null, res)
  31. } else {
  32. event.emit(key, res)
  33. res.data && (res.data.__once = true)
  34. }
  35. let index = requestings.indexOf(key)
  36. requestings.splice(index, 1)
  37. return res
  38. }
  39. return axios.get(url).then(res => result(res)).catch(res => result(res, 1))
  40. }
  41. }
  42. function getSubdomain() {
  43. index === subdomains.length && (index = 0)
  44. return subdomains[index++]
  45. }
  46. function storeCtrl(key, data) {
  47. db.add({id: key, ...data})
  48. store[key] = data
  49. }
  50. function obtain(key) {
  51. let index = joinKeys.indexOf(key)
  52. joinKeys.splice(index, 1)
  53. joinKeys.push(key)
  54. }
  55. async function getData(x, y, z) {
  56. let key = `${x}-${y}-${z}`
  57. let url = urlTemplate
  58. .replace('{s}', getSubdomain())
  59. .replace('{x}', x)
  60. .replace('{y}', y)
  61. .replace('{z}', z)
  62. let obj = await db.get(key)
  63. if (obj) {
  64. return obj
  65. } else {
  66. let data = await ajaxGetData(key, url).then(res => res.data)
  67. if (data && data.__once) {
  68. storeCtrl(key, data)
  69. }
  70. return data
  71. }
  72. }
  73. return getData
  74. })();
  75. function filter(features) {
  76. let result = []
  77. features.forEach(item => {
  78. if (!~geos.indexOf(item.id)) {
  79. geos.push(item.id)
  80. result.push(item)
  81. }
  82. })
  83. return result
  84. }
  85. async function getFeatures(x, y, z) {
  86. let data = await getData(x, y, z)
  87. let features = data && data.features ? filter(data.features) : []
  88. return features
  89. }
  90. function clearGeos (ids) {
  91. ids.forEach(id => {
  92. let index = geos.indexOf(id)
  93. if (~index) {
  94. geos.splice(index, 1)
  95. }
  96. })
  97. }
  98. export {
  99. getFeatures,
  100. clearGeos
  101. }