Firebase和Angular中的回调

时间:2014-07-15 19:20:59

标签: javascript angularjs firebase angularfire

我正在使用angular进行Firebase教程,它首先在控制器中发出child_added个请求,但现在我们正在重构并将这些请求移动到服务中 - 正如我们应该的那样。

但是,我不熟悉的服务中使用了一些语法。这是我的服务,它向firebase db发出child_added请求:

app.service(‘messageService’, function() {
    var messagesRef = new Firebase(FBURL);
    return {
        childAdded: function childAdded(callback) {
            messagesRef.on(‘child_added’, function(data) {
                callback.call(this, {
                    user: data.val().user,
                    text: data.val().text,
                    name: data.name()
                });
            });
        }   
    }
}

然后在控制器中我们正在使用这样的服务:

messageService.childAdded(function(addedChild) {
    $timeout(function() {
        $scope.messages.push(addedChild);
    });
});

首先,我对callback.call(this, ...正在做什么感到困惑?其次,该行如何与控制器中的push()方法相结合?

我非常感谢任何解释。谢谢!

1 个答案:

答案 0 :(得分:3)

call()只是JavaScript标准库中的一个函数(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call)。

您的代码:

callback.call(this, {
  user: data.val().user,
  text: data.val().text,
  name: data.name()
});

几乎与说法相同:

callback({
  user: data.val().user,
  text: data.val().text,
  name: data.name()
});

function (addedChild) {...}是你的回调。

因此,在您的代码中,addedChild最终只是:

{
  user: data.val().user,
  text: data.val().text,
  name: data.name()
}

data是添加的子项的DataSnapshot,data.val()是其值,data.name()是其关键字。

使用call()与直接调用回调的唯一不同之处在于,调用允许您指定调用者,调用者成为回调的this对象。 (很多电话*在最后一句话中继续)。