-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
31 lines (26 loc) · 768 Bytes
/
index.js
File metadata and controls
31 lines (26 loc) · 768 Bytes
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
const promises = {}
export default src => {
const doc = document
if (promises[src]) return promises[src]
let onLoadSuccess, onLoadError
promises[src] = new Promise((resolve, reject) => {
onLoadSuccess = resolve
onLoadError = reject
})
let loaded = false
const tag = 'script'
const script = doc.createElement(tag)
script.src = src
script.async = 1
script.onreadystatechange = script.onload = () => {
const { readyState } = script
if (readyState && !['complete', 'loaded'].includes(readyState)) return
if (loaded) return
loaded = true
onLoadSuccess()
}
script.onerror = onLoadError
const firstScript = doc.querySelector(tag)
firstScript.parentNode.insertBefore(script, firstScript)
return promises[src]
}