123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- import axios from 'axios'
- import * as db from '../core/db'
- import ReqEvent from '../core/Event'
- const store = {}
- const geos = []
- const getData = (() => {
- let joinKeys = []
- let urlTemplate = 'https://{s}.data.osmbuildings.org/0.2/anonymous/tile/{z}/{x}/{y}.json'
- let subdomains = ['a', 'b', 'c', 'd']
- let index = 0
- let requestings = []
- let event = new ReqEvent()
- async function ajaxGetData(key, url) {
- let index = requestings.indexOf(key)
- if (~index) {
- return new Promise((resolve, reject) => {
- event.once(key, (data, error) => {
- if (error) {
- reject(error)
- } else {
- data.data && (data.data.__once = false)
- resolve(data)
- }
- })
- })
- } else {
- requestings.push(key)
- function result(res, err) {
- if (err) {
- event.emit(key, null, res)
- } else {
- event.emit(key, res)
- res.data && (res.data.__once = true)
- }
- let index = requestings.indexOf(key)
- requestings.splice(index, 1)
- return res
- }
- return axios.get(url).then(res => result(res)).catch(res => result(res, 1))
- }
- }
- function getSubdomain() {
- index === subdomains.length && (index = 0)
- return subdomains[index++]
- }
- function storeCtrl(key, data) {
- db.add({id: key, ...data})
- store[key] = data
- }
- function obtain(key) {
- let index = joinKeys.indexOf(key)
- joinKeys.splice(index, 1)
- joinKeys.push(key)
- }
- async function getData(x, y, z) {
- let key = `${x}-${y}-${z}`
- let url = urlTemplate
- .replace('{s}', getSubdomain())
- .replace('{x}', x)
- .replace('{y}', y)
- .replace('{z}', z)
- let obj = await db.get(key)
- if (obj) {
- return obj
- } else {
- let data = await ajaxGetData(key, url).then(res => res.data)
- if (data.__once) {
- storeCtrl(key, data)
- }
- return data
- }
- }
- return getData
- })();
- function filter(features) {
- let result = []
- features.forEach(item => {
- if (!~geos.indexOf(item.id)) {
- geos.push(item.id)
- result.push(item)
- }
- })
- return result
- }
- async function getFeatures(x, y, z) {
-
- let data = await getData(x, y, z)
- let features = data.features ? filter(data.features) : []
- return features
- }
- function clearGeos (ids) {
- ids.forEach(id => {
- let index = geos.indexOf(id)
- if (~index) {
- geos.splice(index, 1)
- }
- })
- }
- export {
- getFeatures,
- clearGeos
- }
|