2016-01-19 131 views
1

关于$ HTTP的官方文档:

的$ HTTP API是基于由$ Q 服务公开的递延/承诺的API。

的$ HTTP服务是一个函数,它接受一个参数 - 一个 配置对象 - 这是用来生成一个HTTP请求, 返回一个承诺

那么什么是下面的代码的含义:

var deferred = $q.defer(); 
var promise = deferred.promise; 
var progress; 
$http.get("https://api.github.com/repos/angular/angular.js/pulls") 
.success(function(data){ 
    var result = []; 
    for(var i = 0; i < data.length; i++){ 
     result.push(data[i].user); 
     progress = (i+1)/data.length * 100; 
     deferred.notify(progress); 
    } 
    deferred.resolve(result); 
    }) 
.error(function(error){ 
    deferred.reject(error); 
}); 
return promise; 

如果$ HTTP返回一个承诺,我为什么要使用$ q返回一个承诺?

+0

嗯。这很奇怪。通常情况下,你只需要做一些类似'.success()。then()'的东西。我想知道他们的文档是否令人难以置信地过时,或者由于某些原因angular不支持承诺链接。 – m0meni

+0

@ AR7,Angular确实支持承诺链接,而不是使用'success()'方法,现在已经废弃了。有关详细信息,请参阅下面的答案。用'$ http.get()。然后()'一切按预期工作。 – lex82

回答

1

使用$http服务的推荐方法是这样的:

$http({ 
    method: 'GET', 
    url: '/someUrl' 
}).then(function successCallback(response) { 
    // success code here 
    }, function errorCallback(response) { 
    // error handling code here 
    }); 

在这种情况下,你不必返回一个新的希望,但是可以只返回结果按照您的预期致电then()

然而,success()方法是通过响应对象的字段作为单独的参数已经一个方便的方法:

.then(function(response) { 
    // do something with response.data, response.status, etc. 
}) 

.success(function(data, status, headers, config) { 
    // do something with data, status, etc. 
}) 

然而,在对比then()success()不返回承诺。我不会推荐使用它,而我刚刚在the docs中看到,它现在已被弃用。

更新:我认为另一个承诺在您提供的实例构造的原因并不是success()可以使用,但在调用deferred.notify(progress)是可能的。如果不明确另外承诺,您将无法访问deferred对象。

+0

什么退货承诺是$ http(),不成功() – dylan

+0

你是什么意思? '$ http.get()'返回一个承诺。如果你在这个承诺上调用'.then()',你会获得另一个承诺(例如你可以从你的函数中返回)。然而,'success()'不会返回一个承诺。所以,如果你想使用'success()',你必须使用'$ q.defer()'创建另一个承诺,并手动将它们连接在一起。 – lex82

+0

@ kuma,我更新了我的答案。是否清楚您的代码将不得不被更改以避免明确创建另一个承诺?如果没有,我会将它添加到我的答案。 – lex82

0

$ http正在返回一个承诺,我们使用该承诺并因此获得'成功'(也可以使用'then')。如果你使用这个$ HTTP调用的服务,从您的控制器调用这个服务方法,那么你将要返回来自该方法的承诺,这样你就可以。然后使用和.catch的等

0

一个新实例通过调用$ q.defer()来构造延迟。 递延对象的目的是揭露有关承诺情况,以及可用于信令的成功不成功完成,还有 任务状态的API

$ q与角度中的$ rootScope.Scope Scope模型观察机制集成在一起,这意味着更快的分辨率或拒绝传播到模型中,并避免不必要的浏览器重绘,从而导致UI闪烁。

refernce:官方文件