Skip to content

Instantly share code, notes, and snippets.

@cancer
Created July 18, 2013 14:05
Show Gist options
  • Save cancer/6029586 to your computer and use it in GitHub Desktop.
Save cancer/6029586 to your computer and use it in GitHub Desktop.
Angular.jsでDeferredしたくて頑張ってみたらcss animationが綺麗に書けた ref: http://qiita.com/cancer/items/57ac6b3b0b5d04ed74d6
myDeferredA = (state) ->
deferred = $q.defer()
successMsg = 'Success!'
errorMsg = 'Error!'
setTimeout( ->
$scope.$apply ->
if state == 0
deferred.resolve successMsg
else
deferred.reject errorMsg
, 3000)
deferred.promise
promiseA = myDeferredA(Math.random()*2|0)
promiseA.then (msg) ->
console.log "success: #{msg}"
, (msg) ->
console.log "error: #{msg}"
$q.when(myDeferredA, myDeferredB, myDeferredC).then ->
console.log "all promises are completed!!"
#
# myDefferedA#resolve() | complete |
# myDefferedB#resolve() | complete | -> success
# myDefferedC#resolve() | complete |
#
$q.when(myDeferredA, myDeferredB, myDeferredC).then ->
console.log "some one promise is completed!!"
#
# myDefferedA#resolve() | -> not complete |
# myDefferedB#resolve() | -> complete | -> success
# myDefferedC#resolve() | -> not complete |
#
animation = cssAnimation.create element
animation
.end(->
...
).end(->
...
).end
class Animation
constructor: (elem) ->
css = $window.getComputedStyle elem[0], ''
duration = css[supportAnimation.duration] || '0s'
@elem = elem
@_msec = +duration * 1000
@_queue = []
@_isProgress = false
@_promise = null
# eventをbindしてdeferオブジェクトを返す
set: (event, callback, isReturnPromise) ->
isReturnPromise = false unless isReturnPromise?
_dfdFunc = () =>
dfd = $q.defer()
@elem.bind event, =>
@elem.unbind event, callback
# callbackの中でresolve/rejectできるようにしておく
callback.call(@, dfd)
dfd.resolve() unless isReturnPromise
return dfd.promise
@done _dfdFunc
return @
# animationEnd用のsetラッパー
end: (callback, isReturnPromise) ->
return @set supportAnimation.end, callback, isReturnPromise
supportAnimation = do ->
el = document.createElement 'tada'
transEndEventNames =-
'WebkitAnimation' : 'webkitAnimationEnd'
'animation' : 'animationend'
transPropNames =-
'WebkitAnimation' : 'webkitAnimationDuration'
'animation' : 'animationDuration'
for name of transEndEventNames
if el.style[name] isnt undefined
return {
end : transEndEventNames[name],
duration : transPropNames[name]
}
# promiseのsuccessCallbackに`callback`を追加する
# promiseが無ければ`callback`を実行して、promiseを作る
done: (callback) ->
if @_promise == null
@_promise = callback.call(@)
else
@_promise = @_promise.then(callback)
return {
create: (elem) ->
new Animation(elem)
}
module.controller 'hoge', ['cssAnimation', (cssAnimation) ->
element = angular.element document.querySelector '.animation'
animation = cssAnimation.create element
animation
.end(->
console.log '1st animation is ended'
).end(->
console.log '2nd animation is ended'
).end((dfd) ->
$timeout(->
console.log '3rd animation is ended'
dfd.resolve()
, 3000)
, true).done(->
console.log 'all animations are ended'
)
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment