在回调中使用返回值

时间:2014-10-16 19:00:20

标签: javascript angularjs

来自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()回调

但是回来之后不可能执行任何事情,对吗?

2 个答案:

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

  1. User.get()返回一个空白对象,并对/user/123执行异步GET。此空对象将分配给函数作用域中的user变量。
  2. 执行函数的其余部分(如果有的话),函数返回。
  3. 当异步调用返回时,get()方法使用返回的对象的属性填充现有空白对象的属性,因此user变量现在具有回调结果。
  4. get()方法调用您指定的回调。它可以访问现在从异步调用填充的函数user变量。