当前位置: 首页 > 面试题库 >

$ resource`get`函数如何在AngularJS中同步工作?

尉迟俊能
2023-03-14
问题内容

我正在看AngularJS教程,该教程描述了如何使用Angular资源连接到Twitter。(视频教程)这是在示例控制器中设置的资源:

$scope.twitter = $resource('http://twitter.com/:action',
    {action: 'search.json', q: 'angularjs', callback: 'JSON_CALLBACK'},
    {get: {method: 'JSONP'}});

本教程显示了使用get调用从资源取回数据的几种方法。第一种方法是将回调传递给get函数。在ajax请求返回后,将使用结果调用回调:

$scope.twitter.get(function(result) {
    console.log('This was the result:', result);
});

我了解这种方法。这对我来说很有意义。资源表示网络上可以获取数据的位置,get只需对URL进行ajax调用,获取json,然后使用json调用回调函数。该result参数是该JSON。

这对我来说很有意义,因为这显然是异步调用。也就是说,在后台运行ajax调用,并且该调用之后的代码未被阻止,而是继续执行。然后,在稍后的某个不确定时刻,当xhr成功时,将调用回调函数。

然后,本教程显示了一种看起来更简单的不同方法,但是我不明白它是如何工作的:

$scope.twitterResult = $scope.twitter.get();

我假设下面的xhr get必须是异步的,但是在这一行中,我们将get调用的返回值分配给一个变量,就像它是同步返回一样。

我不理解这一点错吗?那怎么可能?我认为它真的很干净,我只是不明白。

我知道在xhr下的xhr关闭并异步处理时,它get可以返回 某些内容
,但是如果您自己遵循代码示例,则将看到$scope.twitterResult在执行任何后续行之前获取实际的twitter内容。例如,如果您console.log($scope.twitterResult)在该行之后立即编写,您将看到在控制台中登录的twitter的结果,而不是稍后将替换的临时值。

更重要的是,因为这是可能的,我如何编写一个利用此相同功能的Angular服务?除了ajax请求外,还有其他类型的数据存储区需要异步调用,这些存储可以在JavaScript中使用,我希望能够以这种方式同步编写代码。例如,IndexedDB。如果我能全神贯注于Angular的内置资源的运行方式,那么我会做个尝试。


问题答案:

$ resource不是同步的,尽管此语法可能表明它是:

$scope.twitterResult = $scope.twitter.get();

这到底是怎么回事是调用AngularJS会,号召后twitter.get()其结果是空数组立即返回。
然后,当异步调用完成并且真实数据从服务器到达时,该数组将使用data更新
。AngularJS只会保留对返回数组的引用,并在有数据时将其填充。

这是发生“魔术”的$
resource实现的片段:https
:
//github.com/angular/angular.js/blob/master/src/ngResource/resource.js#L372

$ resource文档
中也对此进行了描述:

重要的是要意识到调用$
resource对象方法会立即返回一个空引用(对象或数组取决于isArray)。从服务器返回数据后,将使用实际数据填充现有引用。这是一个有用的技巧,因为通常资源会分配给模型,然后由视图呈现。如果对象为空,则不会进行渲染,一旦数据从服务器到达,该对象就会被数据填充,并且视图会自动重新渲染以显示新数据。这意味着在大多数情况下,无需为动作方法编写回调函数。



 类似资料:
  • 问题内容: 我对Java同步有疑问。我想知道我的类中是否有三个同步方法,并且一个线程在一个同步方法中获得了锁,另外两个将被锁定吗?我问这个问题是因为我对以下陈述感到困惑。 当线程处于对象的同步方法内部时,希望执行该同步方法或对象的任何其他同步方法的所有其他线程将必须等待。此限制不适用于已经具有锁并正在执行对象的同步方法的线程。这样的方法可以调用对象的其他同步方法而不会被阻塞。当然,任何线程都可以随

  • 我是JavaScript和React的新手,我正试图远离教程,所以为了自己的学习利益,我开始制作一个简单的应用程序,但遇到了功能异步运行的障碍。 在中,有一个,其回调中包含以下内容: 如何使上述两个函数同步运行使用在中设置的,但下面的显示在完成之前启动。 我已经阅读了一些参考资料,其中提到使用promise,但我不知道如何应用它。。。我还想知道是否可以通过/实现。 完整(ish)代码:(为了简单起

  • 我对Java同步有一个疑问。我想知道如果我的类中有三个同步方法,一个线程在一个同步方法中获取锁,其他两个会被锁定吗?我问这个问题是因为我与以下语句混淆了。 当一个线程在一个对象的同步方法内部时,所有希望执行这个同步方法或该对象的任何其他同步方法的其他线程都必须等待。这个限制不适用于已经有锁并正在执行该对象的同步方法的线程。这样的方法可以调用该对象的其他同步方法而不会被阻塞。该对象的非同步方法当然可

  • 我正在使用无法修改的同步第三个功能,例如: 生成一个新的线程来完成这项工作,并立即返回,当事情完成时,我的onDone函数将被调用。 我想写一个异步方法来包装,这样有人可以这样调用它: 在中,我调用来做真正的事情。但是我不知道如何编写。 有人能告诉我这是否可能,以及怎么做吗?谢谢。

  • 问题内容: 自从我开始用Java编程以来,我一直在想(大约一两年)。在C语言中,我们必须知道不同的方法才能正确避免线程之间的死锁,因此在同步方法之间有更多选择。 那么Java呢?当我们同步时,如何避免将线程置于死锁状态?它在内部如何运作?是否可以避免死锁,因为我们在比C(或C ++)更高的级别上进行了同步?关于Java中的死锁和同步的任何文档吗? 问题答案: 在后台,它使用两个操作码和字节码级别,

  • 问题内容: 首先,这是一个示例: 我没有得到的是堵塞如何发生。main函数启动两个线程,每个线程都开始各自的弓箭操作。 “同步”到底阻止了什么?为同一对象运行的功能相同(就像我最初想的那样)?同一类的所有对象具有相同的功能吗?同一对象的所有同步功能?同一类所有对象的所有同步功能? 问题答案: 在Java中,每个函数都提供了在其上锁定或锁定线程的功能。同步方法时,该方法将其对象实例用作锁。在你的示例