3

次の行を使用して、と呼ばれるファクトリを介してサーバーにデータを投稿するコントローラーがありますSendDataFactory

SendDataFactory.sendToWebService(dataToSend)

そして、私の工場SendDataFactoryは次のようになります。

angular
  .module('az-app')
  .factory('SendDataFactory', function ($http, $q) {

    var SendData = {};

    /**
     * Sends data to server and
     */
    SendData.sendToWebService = function (dataToSend) {

      var url = "example.com/url-to-post";
      var deferred = $q.defer();

      $http.post(url, dataToSend)

        //SUCCESS: this callback will be called asynchronously when the response is available
        .then(function (response) {
          console.log("Successful: response from submitting data to server was: " + response);

          deferred.resolve({
            data: data
          });
        },

        //ERROR:  called asynchronously if an error occurs or server returns response with an error status.
        function (response) {
          console.log("Error: response from submitting data to server was: " + response);

          deferred.resolve({
            data: data
          });
        }
      );

      return deferred.promise;
    }

    return SendData;
  });

こことインターネットでいくつかの例を見てきました

$http.post().success...

でも使いたい

$http.post().then...

angularドキュメントが言うので:

$http の従来の promise メソッドの success と error は非推奨になりました。代わりに、標準の then メソッドを使用してください。$httpProvider.useLegacyPromiseExtensions が false に設定されている場合、これらのメソッドは $http/legacy エラーをスローします。

私が必要なもの

ここで、コントローラーで、成功したかどうかを確認$http.post().then...し、成功または失敗に基づいて何かを行う必要があります。どうすればこれを達成できますか?

4

2 に答える 2

4

によって拒否されたときに、それを解決するのではなく、約束を拒否し$httpます。

/**
 * Sends data to server and
 */
SendData.sendToWebService = function (dataToSend) {

  var url = "example.com/url-to-post";
  var deferred = $q.defer();

  $http.post(url, dataToSend)

    //SUCCESS: this callback will be called asynchronously when the response is available
    .then(function (response) {
      console.log("Successful: response from submitting data to server was: " + response);

      deferred.resolve(response.data);  // Resolving using response.data, as data was not defined.
    },

    //ERROR:  called asynchronously if an error occurs or server returns response with an error status.
    function (response) {
      console.log("Error: response from submitting data to server was: " + response);


      deferred.reject(response.data);  // Rejecting using response.data, as data was not defined.
    }
  );

  return deferred.promise;
}

その後、 を使用してサービスでコールバックを処理するのと同じ方法で、コントローラーから呼び出すことができますthen

promise を返すため$http、promise チェーンを使用してさらに単純化できます。この方法では、追加の遅延オブジェクトを使用する必要はありません。

/**
 * Sends data to server and
 */
SendData.sendToWebService = function (dataToSend) {

  var url = "example.com/url-to-post";

  return $http.post(url, dataToSend)

    //SUCCESS: this callback will be called asynchronously when the response is available
    .then(function (response) {
      console.log("Successful: response from submitting data to server was: " + response);

      return response.data;  // Resolving using response.data, as data was not defined.
    },

    //ERROR:  called asynchronously if an error occurs or server returns response with an error status.
    function (response) {
      console.log("Error: response from submitting data to server was: " + response);


      return $q.reject(response.data);  // Rejecting using response.data, as data was not defined.
    }
  );
}
于 2015-09-24T18:13:20.053 に答える
4

これはあなたが意味したことだと思います:

$http.post(url, dataToSend)

    //SUCCESS: this callback will be called asynchronously when the response is available
    .then(function (response) {
      console.log("Successful: response from submitting data to server was: " + response);

      deferred.resolve({
        data: response //RETURNING RESPONSE SINCE `DATA` IS NOT DEFINED
      });
    },

    //ERROR:  called asynchronously if an error occurs or server returns response with an error status.
    function (response) {
      console.log("Error: response from submitting data to server was: " + response);

      //USING THE PROMISE REJECT FUNC TO CATCH ERRORS
      deferred.reject({
        data: response //RETURNING RESPONSE SINCE `DATA` IS NOT DEFINED
      });

    }
  );

  return deferred.promise;
}

コントローラーで次を使用できるようになりました。

SendDataFactory.sendToWebService(dataToSend)
    .then(function(data) { /* do what you want */ })
    .catch(function(err) { /* do what you want with the `err` */ });
于 2015-09-24T18:02:30.063 に答える