-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdefer.co
More file actions
69 lines (56 loc) · 1.6 KB
/
Copy pathdefer.co
File metadata and controls
69 lines (56 loc) · 1.6 KB
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
#### Backbone.Joint.Deferred ###
#Backbone.Joint _hopes_ to borrow deferred from jQuery
#developer may override this to adapt their own deferred
#---
let @ = $J.Deferred = {}
@when = $~when
@defer = ->
dfr = $.Deferred!
{
resolver: dfr~{resolve, reject, notify, state}
promise: @_mkPromise dfr
}
#simple resolved promise creation
@resolve = (...args)~>
{resolver, promise} = @defer!
resolver.resolve ...args
promise
#simple rejected promise creation
@reject = (...args)~>
{resolver, promise} = @defer!
resolver.reject ...args
promise
#convert event to promise
@listen = (obj, [okEvents, okCb], [failEvents, failCb] || [null, null])~>
{resolver, promise} = @defer!
obj.once okEvents, okHandler if okEvents
obj.once failEvents, failHandler if failEvents
function okHandler
resolver.resolve result okCb
obj.off failEvents, failHandler if failEvents
function failHandler
resolver.resolve result failCb
obj.off okEvents, okHandler if okEvents
function result cb
if _.isFunction cb
cb!
else
cb
return promise
#jQuery detection
@_mkPromise = \
if ver = $::jquery
switch
#jQ1.5~1.7 use `pipe` instead of `then`
case ver.match /^1\.[5-7]/
->
with it.promise!
#monkey patch the difference
&then = ->
newPromise = @pipe ...
newPromise.then = @@callee
newPromise
default
-> it.promise!
else
-> it.promise!