1

下面的函数getUserData(),我希望日志语句的序列是从firebase服务器返回的'someusername'然后是1,2,3,但我得到1,2,3,-firebasereturninfo。我可以def看到firebase返回数据和1如何以不同的顺序记录,但是在我对promise对象的理解中,def不应该被调用,直到第一个.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()

控制台输出的屏幕截图。在此处输入图像描述

4

1 回答 1

1

问题(或者说是误解)是Firebase.once没有立即调用回调函数(作为它的第二个参数)。相反,在您的情况下,此函数被分配为“值”事件处理程序 - 但该事件与您之前设置的 promise 没有任何共同之处。

您可能应该做的是将 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()
于 2013-10-30T18:45:33.460 回答