3

我不确定我应该在哪里处理我的 ajax 请求的响应。

有2种口味。

  1. 通过 $http 的成功/错误回调处理。
  2. 通过 then() 方法从 promise 结果中处理。

两者都按预期响应。但是,我想每个人都有一个“抓住”的地方。谷歌没有给我指路。angular.js 源代码对我来说有点……神秘。

注意:我的示例 (1) 总是先响应,然后 (2) 再响应。我认为只是因为 localhost 延迟几乎为零,而且它们都是异步方法。

$http({
    method: 'POST',
    url: 'ping.php',
    headers: {'content-type' : 'application/json'}
}).
success(function(data, status, headers, config) {
    console.log("Flavour one success");
}).
error(function(data, status, headers, config) {
    console.log("Flavour one error");                       
}).then(function() { 
    console.log("Flavour two success"); }, 
        function() { console.log("Flavour two error"); 

});

4

2 回答 2

3

在基本的成功/错误回调上使用 Promise 有一些好处。一个好处是您可以按照此处所述链接它们。

链式 Promise 因为调用 Promise 的 then 方法会返回一个新的派生 Promise,所以很容易创建一个 Promise 链:

promiseB = promiseA.then(function(result) {
  return result + 1;
});

// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1`

可以创建任意长度的链,并且由于可以使用另一个 Promise 来解决一个 Promise(这将进一步推迟其解决方案),因此可以在链中的任何点暂停/推迟对 Promise 的解决。这使得实现强大的 API 成为可能,例如 $http 的响应拦截器。

您还可以使用$q.all()组合多个承诺。这在引导依赖于在继续之前加载的多个资源的应用程序时非常有用。

于 2013-07-31T18:01:31.563 回答
1

根据 Angular 文档,

{HttpPromise}– 返回一个带有标准then方法和两个 http 特定方法的 promise 对象:successerror. 该then方法有两个参数:asuccess和一个error回调,它将被一个响应对象调用。success和方法采用error单个参数 - 分别在请求成功或失败时调用的函数。

要回答您的问题,唯一的区别是successanderror只接受一个论点,而then接受两个论点。

第一个总是在第二个之前被调用,仅仅是因为你已经按照这个顺序列出了它,这就是 Promise 的工作方式。如果您列出了另一个then,那么它将被第三个调用。

于 2013-07-31T17:47:39.673 回答