$ http和promises以及POST

时间:2014-07-17 21:15:24

标签: angularjs angular-http angular-promise

给出如下代码:

function webCall() {
    return $http({ method: "POST", 
                       url: "http://destined/to/fail", data: {param1: 1})
                    .success(function(data, status) { return { test: "success!";} } )
                    .error(function (data, status) { 
                               return {errorMessage: "Totally failed!"};
                     });

我的理解是,如果我在返回的承诺上调用.then(),就像这样:

var myPromise = webCall().then(
                               function(response){
                                   console.log(response.test);
                               }, 
                               function(reason) {
                                   console.log(reason.errorMessage); 
                               });

将相应的.success()和.error()回调的返回值传递给.then()回调。

然而,我没有看到我期望的行为。 使用GET可以正常工作。使用POST,不是那么多。我的假设是它应该像正常的延迟\承诺一样准确吗?它在哪里记录(除了来源)

2 个答案:

答案 0 :(得分:0)

$http()会返回一个承诺,但您返回的内容实际上是.error()的结果,这不是承诺(至少没有记录)。

要返回承诺,您已使用then() ...

function webCall() {
    return $http({ method: "POST", 
                   url: "/destined/to/fail", data: {param1: 1})
            .then(function(response) { 
                // if you need to access the data here, use response.data
                return { test: "success!" };
            }, function (response) { 
                throw { errorMessage: "Totally failed!" };
            });
}

注意使用throw来拒绝返回的promise,因为如果你只是从错误回调中返回,它实际上会解析产生的promise。

答案 1 :(得分:0)

它没有按预期工作的原因是因为.success.error处理程序返回原始承诺,并且没有具有返回值成功/错误处理程序。您可以从source code for $http here

中看到
  promise.success = function(fn) {
    promise.then(function(response) {
      fn(response.data, response.status, response.headers, config);
    });
    return promise;
  };

您可以看到,一旦解决了承诺(当Web调用返回时),它将调用您的成功处理程序,然后对其执行任何操作。

当您将其与其他处理程序链接时,它是原始承诺的结果,并传递给其他处理程序。