0

给定如下代码:

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,就没有那么多了。我的假设是否应该像正常的 deferred \ promise 一样准确?它在哪里记录(除了来源)

4

2 回答 2

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拒绝返回的承诺,因为如果您只是从错误回调中返回,它实际上会解析结果承诺。

于 2014-07-17T21:34:21.490 回答
0

它不能按预期工作的原因是.successand.error处理程序返回原始承诺,它对来自成功/错误处理程序的返回值没有任何作用。您可以从$http here 的源代码中看到这一点。

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

你可以看到一旦 promise 被解决(当 web 调用返回时),它会调用你的成功处理程序,然后什么都不做。

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

于 2014-07-17T21:35:00.187 回答