为什么这个angularjs承诺功能不会按顺序启动?

时间:2013-10-30 18:35:41

标签: angularjs firebase promise

下面的函数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()

控制台输出的屏幕截图。enter image description here

1 个答案:

答案 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()