下面的函数getUserData(),我希望日志语句的顺序是从firebase服务器返回的'someusername'然后1,2,3,但我得到1,2,3, - firebasereturninfo。我可以看看firebase如何返回数据,1可能会记录在差异序列中,但是我对promise对象的理解中的2和3应该在第一个.then闭包的内容完成之前不会被调用。有人可以指导我吗?谢谢!
getUserData: (participants) ->
defer = $q.defer()
defer.promise
.then () ->
Session.firebase.child("usernames/someusername").once "value", (userProfile) ->
console.log userProfile.val()
console.log "1"
.then () ->
console.log "2"
.then () ->
console.log "3"
defer.resolve()
控制台输出的屏幕截图。
答案 0 :(得分:1)
问题(或者更确切地说是误解)是Firebase.once没有立即调用回调函数(作为其第二个参数)。而是将此功能指定为“'值”。在您的情况下事件处理程序 - 但该事件与您之前设置的承诺没有任何共同之处。
你应该做的是将defer.resolve放在处理程序中:
defer = $q.defer()
defer.promise
.then () ->
console.log "1"
.then () ->
console.log "2"
.then () ->
console.log "3"
Session.firebase.child("usernames/someusername").once "value", (userProfile) ->
console.log userProfile.val()
defer.resolve()