c1b30988fcef0c93d77df89f5244cc88852266f7.svn-base 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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 = 'https://{s}.data.osmbuildings.org/0.2/anonymous/tile/{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. console.log('get', url)
  15. let index = requestings.indexOf(key)
  16. if (~index) {
  17. return new Promise((resolve, reject) => {
  18. event.once(key, (data, error) => {
  19. if (error) {
  20. reject(error)
  21. } else {
  22. data.data && (data.data.__once = false)
  23. resolve(data)
  24. }
  25. })
  26. })
  27. } else {
  28. requestings.push(key)
  29. function result(res, err) {
  30. if (err) {
  31. event.emit(key, null, res)
  32. } else {
  33. event.emit(key, res)
  34. res.data && (res.data.__once = true)
  35. }
  36. let index = requestings.indexOf(key)
  37. requestings.splice(index, 1)
  38. return res
  39. }
  40. return axios.get(url).then(res => result(res)).catch(res => result(res, 1))
  41. }
  42. }
  43. function getSubdomain() {
  44. index === subdomains.length && (index = 0)
  45. return subdomains[index++]
  46. }
  47. function storeCtrl(key, data) {
  48. db.add({id: key, ...data})
  49. store[key] = data
  50. }
  51. function obtain(key) {
  52. let index = joinKeys.indexOf(key)
  53. joinKeys.splice(index, 1)
  54. joinKeys.push(key)
  55. }
  56. async function getData(x, y, z) {
  57. let key = `${x}-${y}-${z}`
  58. let url = urlTemplate
  59. .replace('{s}', getSubdomain())
  60. .replace('{x}', x)
  61. .replace('{y}', y)
  62. .replace('{z}', z)
  63. let obj = await db.get(key)
  64. if (obj) {
  65. return obj
  66. } else {
  67. let data = await ajaxGetData(key, url).then(res => res.data)
  68. if (data && data.__once) {
  69. storeCtrl(key, data)
  70. }
  71. return data
  72. }
  73. }
  74. return getData
  75. })();
  76. function filter(features) {
  77. let result = []
  78. features.forEach(item => {
  79. if (!~geos.indexOf(item.id)) {
  80. geos.push(item.id)
  81. result.push(item)
  82. }
  83. })
  84. return result
  85. }
  86. async function getFeatures(x, y, z) {
  87. let data = await getData(x, y, z)
  88. let features = data && data.features ? filter(data.features) : []
  89. return features
  90. }
  91. function clearGeos (ids) {
  92. ids.forEach(id => {
  93. let index = geos.indexOf(id)
  94. if (~index) {
  95. geos.splice(index, 1)
  96. }
  97. })
  98. }
  99. export {
  100. getFeatures,
  101. clearGeos
  102. }