【发布时间】:2012-08-11 13:38:13
【问题描述】:
我正在观看thisAngularJS 教程,该教程描述了如何使用 Angular 资源连接到 Twitter。 (Video tutorial) 这是示例控制器中设置的资源:
$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();
我假设get 下面的xhr 必须是异步的,但在这一行中,我们将get 调用的返回值分配给一个变量,就好像它同步返回一样。
我不理解这一点是错的吗?这怎么可能?我觉得它真的很好用,我就是不明白。
我知道get 可以返回 something 而它下面的 xhr 关闭并异步处理,但是如果您自己按照代码示例进行操作,您会看到 $scope.twitterResult 获取实际的 twitter执行任何后续行之前的内容。例如,如果您在该行之后立即写 console.log($scope.twitterResult),您将看到来自 twitter 的结果记录在控制台中,而不是稍后替换的临时值。
更重要的是,因为这是可能的,我如何编写一个利用相同功能的 Angular 服务?除了 ajax 请求之外,还有其他类型的数据存储需要异步调用,可以在 JavaScript 中使用,我希望能够以这种风格同步编写代码。例如,索引数据库。如果我能理解 Angular 的内置资源是如何做到的,我会试一试。
【问题讨论】:
-
仅供参考,不是 AJAX 请求,否则必须使用 CORS。 JSONP 是 !== XMLHttpRequest();
-
您在这里基本上是在谈论承诺。 $http 和 $resource 现在都支持 Promise。
标签: javascript angularjs