fuchengshen
2022-07-09 3a25c05b5ab837714f30469cdcb1e2a77d8d7f6c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
"use script" // 开发环境建议开启严格模式
 
const url = "https://api.waqi.info/mapq/bounds/?bounds={RECTANGLE}&inc=placeholders&k={KEY}&_={DATA}"
const table = [
  {
    level: "一级(优)",
    influence: "空气质量令人满意,基本无空气污染",
    suggestion: "各类人群可正常活动"
  },
  {
    level: "二级(良)",
    influence: "空气质量可接受,但某些污染物可能对极少数异常敏感人群健康有较弱影响",
    suggestion: "心脏病和肺病患者症状显著加剧,运动耐受力降低,健康人群普遍出现症状"
  },
  {
    level: "三级(轻度污染)",
    influence: "易感人群症状有轻度加剧,健康人群出现刺激症状",
    suggestion: "儿童、老年人及心脏病、呼吸系统疾病患者应减少长时间、高强度的户外锻炼"
  },
  {
    level: "四级(中度污染)",
    influence: "易感人群症状有轻度加剧,健康人群出现刺激症状",
    suggestion: "儿童、老年人及心脏病、呼吸系统疾病患者避免长时间、高强度的户外锻炼,一般人群适量减少户外运动"
  },
  {
    level: "五级(重度污染)",
    influence: "心脏病和肺病患者症状显著加剧,运动耐受力降低,健康人群普遍出现症状",
    suggestion: "儿童、老年人及心脏病、肺病患者应停留在室内,停止户外运动,一般人群减少户外运动"
  },
  {
    level: "六级(严重污染)",
    influence: "心脏病和肺病患者症状显著加剧,运动耐受力降低,健康人群普遍出现症状",
    suggestion: "儿童、老年人和病人应停留在室内,避免体力消耗,一般人群避免户外活动"
  }
]
 
let xmlHttpRequest
const nWidth = 500
let currTime
 
onmessage = function (e) {
  const bounds = e.data.bounds
  currTime = new Date().getTime()
 
  const strKey = jskey()
  const nowUrl = url.replace("{RECTANGLE}", bounds).replace("{KEY}", strKey).replace("{DATA}", currTime)
 
  xmlHttpRequest = new XMLHttpRequest()
 
  // 2.设置回调函数
  xmlHttpRequest.onreadystatechange = callback
 
  // 3.初始化XMLHttpRequest组建
  xmlHttpRequest.open("POST", nowUrl, true)
 
  // 4.发送请求
  xmlHttpRequest.send()
}
 
function callback() {
  if (xmlHttpRequest.readyState === 4 && xmlHttpRequest.status === 200) {
    const entityTable = []
    /// /////////////////////////////////////////////////
    const currentData = JSON.parse(xmlHttpRequest.responseText)
    for (let i = currentData.length - 1; i >= 0; i--) {
      const item = currentData[i]
      let aqi = parseInt(item.aqi)
      if (!isNumber(aqi)) {
        continue
      }
 
      let level = 0
      if (aqi > nWidth) {
        level = 5
        aqi = nWidth - 1
      } else {
        if (aqi > 300) {
          level = 5
        } else if (aqi > 200) {
          level = 4
        } else if (aqi > 150) {
          level = 3
        } else if (aqi > 100) {
          level = 2
        } else if (aqi > 50) {
          level = 1
        }
      }
 
      const newItem = {
        ...item,
        aqi: aqi,
        level: table[level].level,
        influence: table[level].influence,
        suggestion: table[level].suggestion
      }
      entityTable.push(newItem)
    }
    /// ///////////////////////////////////////////////////
    // self代表子线程自身
    self.postMessage({ currTime: currTime, entityTable: entityTable })
    self.close()
  } else if (xmlHttpRequest.readyState === 4 && xmlHttpRequest.status === 0) {
    self.postMessage({ currTime: currTime, entityTable: [] })
    self.close()
  }
}
 
function isNumber(obj) {
  return typeof obj === "number" && !isNaN(obj)
}
 
function jskey() {
  return (function () {
    let u = ""
    decodeURIComponent("%603Z3F%7BWS%3A3BSBdIRlJTySXYnmecFR%2CF%7BeSGHhkMh%3E%3E")
      .split("")
      .forEach(function (c) {
        u += String.fromCharCode(c.charCodeAt(0) - 1)
      })
    return u
  })()
}