-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathDynamicLoader.coffee
82 lines (62 loc) · 2.22 KB
/
DynamicLoader.coffee
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
###
DynamicLoader Module for FramerJS
https://github.com/LucienLee/framer-DynamicLoader/
Created by Lucien Lee (@luciendeer), Jan. 12th, 2016
DynamicLoader braeks the barriars between 3rd party web development libraries and Framer, which
help you load local, external stylesheets and scripts dynamically.
Add the following line to your project in Framer Studio.
{DynamicLoader} = require 'DynamicLoader'
[Load one file]
DynamicLoader.add('script.js').then(->
# when script.js loaded successfully
...
).catch(->
# when script.js loaded failed
...
)
[Load file in series]
DynamicLoader.series(['one.js', 'two.css', ...]).then( successCallback, failCallback )
[Load file in parallel]
DynamicLoader.series(['one.js', 'two.css', ...]).then( successCallback, failCallback )
###
class exports.DynamicLoader
# Promisify single dynamic script loading
@add = (url) ->
promise = new Promise((resolve, reject) ->
if url.substr( url.lastIndexOf('.') ) is ".js"
# load script once
loaded = Array.prototype.find.call document.getElementsByTagName('script'), (element) ->
if element.getAttribute('src') is url then return element
if loaded isnt undefined then return resolve 'have loaded'
file = document.createElement 'script'
file.src = url
else if url.substr( url.lastIndexOf('.') ) is ".css"
# load style once
loaded = Array.prototype.find.call document.getElementsByTagName('link'), (element) ->
if element.getAttribute('rel') is url then return element
if loaded isnt undefined then return resolve 'have loaded'
file = document.createElement 'link'
file.rel = "stylesheet"
file.href = url
file.addEventListener 'load', ->
resolve file
file.addEventListener 'error', ->
reject file
document.body.appendChild file
)
return promise
# Dynamic file loading in series
@series = (urls) ->
if !Array.isArray(urls) or urls.length is 0 then throw "ERROR: NO URL IN ARRAY!"
return urls.reduce(
(promise, url) =>
return promise.then( => @add(url) )
,
Promise.resolve())
# Dynamic file loading in parallel
@parallel = (urls) ->
if !Array.isArray(urls) or urls.length is 0 then throw "ERROR: NO URL IN ARRAY!"
Promise.all(
urls.map( (url) =>
return @add(url)
))