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()は promise を返しますが、実際に返されるのは の結果であり.error()、これは promise ではありません (少なくともそのように文書化されていません)。

Promise を返すには、次の使用法があります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 が実際に解決されるためです。

于 2014-07-17T21:34:21.490 に答える
0

期待どおりに動作しない理由は、.successand.errorハンドラーが元の promise を返し、成功/エラー ハンドラーからの戻り値で何もしないためです。これは $http hereのソース コードから確認できます。

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

Promise が解決されると (Web 呼び出しが返されると)、success ハンドラーが呼び出され、それに対して何もしないことがわかります。

これを他のハンドラーと連鎖させると、他のハンドラーに渡される元の promise の結果になります。

于 2014-07-17T21:35:00.187 に答える