【问题标题】:How does it make sense to use the variable name used to name a function inside that same function?在同一个函数中使用用于命名函数的变量名有什么意义?
【发布时间】:2015-02-06 04:39:53
【问题描述】:

在这个 sn-p 中,从 Angular documentation on $resource 开始,函数的名称是 user,并且在函数内部它们使用的是同名变量。

var User = $resource('/user/:userId', {userId:'@id'});
var user = User.get({userId:123}, function() {
  user.abc = true;
  user.$save();
});

这有什么意义?以及这方面的规则是什么?

【问题讨论】:

  • 看起来您在获取回调中错过了函数参数:User.get({userId:123}, function(user) {
  • 并非如此。回调函数内容参考var user
  • 我认为@Rasalom 拥有它的权利,这是文档中的错字——如果您在文档中进一步搜索$save,您会看到该代码重复但带有user 被传递到回调函数中。
  • 它明确指向函数参数,这是一个示例小提琴:jsfiddle.net/fq5v75w3
  • @Blazemonger 所以 Angular 文档中又出现了错误?

标签: javascript angularjs ngresource


【解决方案1】:

“user”不是函数名,它是从给定资源中读取的对象名。

说得对。用户成为代理,当 http 请求完成时填充数据。

第二个参数 - 函数是回调,在用户成功加载后调用,因此用户成为完全创建的对象。

所以当 .get 被调用时,它的工作原理就是这样:

  • 使用“代理”创建可变用户
  • 从 /user/123 读取用户
  • 使用数据和“资源的方法”($save、$delete...)实现用户变量
  • 调用给定函数回调,其中:
    • 在用户对象中设置 abc
    • 将其保存回资源($save 将 POST 引入 /user/123

在文档中您可以阅读:https://docs.angularjs.org/api/ngResource/service/$resource - (部分使用/返回)

"重要的是要意识到调用 $resource 对象方法 立即返回一个空引用(对象或数组取决于 是数组)。一旦数据从服务器返回,现有的 参考用实际数据填充。这是一个有用的技巧 因为通常资源被分配给一个模型,然后 由视图渲染。拥有一个空对象会导致不渲染, 一旦数据从服务器到达,然后填充对象 与数据和视图自动重新呈现自己显示 新数据。这意味着在大多数情况下,人们不必编写 动作方法的回调函数。”

"user" 不必作为参数传递,因为用户是在调用回调之前设置的。

【讨论】:

  • 我的意思是用户在从资源读取之前被分配。这不是承诺。它只是一个空对象,您可以将其传递给您的模板,并在读取资源完成时填充(并更新))
  • 我已经添加了文档的确切部分
【解决方案2】:

当您调用User.get() 时,它会返回一个承诺,然后继续处理。当该承诺解决时,角度将您设置的变量设置为分辨率的值,在本例中为user。它调用了成功回调函数,所以你可以安全地改变它。

要使用上面的示例,会发生以下情况。

  1. 你调用了`User.get({userId:123})
  2. User.get 返回一个承诺并将var user 设置为该承诺
  3. 处理继续
  4. 承诺解决了,让我们说给{id:123,name:"Imray"}
  5. angular 将变量user 设置为{id:123,name:"Imray"}
  6. angular 调用您的成功回调,您在其中:
  7. user.abc 设置为true,所以你的对象现在是{id:123,name:"Imray",abc:true}
  8. 您调用user.$save(),将其保存到服务器等。

基本上没有什么问题,只是注意执行的顺序。

【讨论】:

  • 所以回调运行就好像它完全独立于它所在的函数?好像是写了几行的随机函数?
  • 差不多。它独立运行,但仅在解析 User.get() 时调用。
  • 啊哈。这似乎是一种奇怪的方式,但我想它有效
  • 它为您提供了选择。您可以只使用var user = User.get({userId:123}); 并依靠角度来解决它,或者您可以在解决时使用回调来进行额外的处理。或两者。文档中的示例旨在显示两者。
猜你喜欢
  • 1970-01-01
  • 2017-11-14
  • 2018-07-11
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
相关资源
最近更新 更多