来自Angularjs Docs的this example中有一些*魔法*,我无法弄明白。 这是一个代码:
var User = $resource('/user/:userId', {userId:'@id'});
var user = User.get({userId:123}, function() {
user.abc = true;
user.$save();
});
有一件事令我困惑 - 当需要首先填充用户时,我们如何在回调中引用用户对象并获取检索到的数据。但要这样做,应该从 User.get()返回值。
就像那样:
调用 User.get()→从 User.get()返回→调用 function()回调
但是回来之后不可能执行任何事情,对吗?
答案 0 :(得分:2)
绝对有可能返回用户并仍然没有执行回调,这就是这个代码示例所显示的内容。
User.get的实现可能类似于:
User.prototype.get = function(parameters, callback) {
var user = {
abc: false
}
// do other stuff to construct the object
someLongAsyncOperation(callback);
return user;
}
此处返回用户,但仍有回调要完成。然后在该回调中,可以通过闭包范围访问用户。 someLongAsyncOperation可以是以后调用回调的任何东西,你可以用setTimeout或Angular的$ timeout这么简单的东西自己试试。
在我看来,它不是一个很棒的模式,最好将创建的用户作为参数包含在回调中 - 但它可以工作。
答案 1 :(得分:0)
User.get()
返回一个空白对象,并对/user/123
执行异步GET。此空对象将分配给函数作用域中的user
变量。get()
方法使用返回的对象的属性填充现有空白对象的属性,因此user
变量现在具有回调结果。get()
方法调用您指定的回调。它可以访问现在从异步调用填充的函数user
变量。