如何从控制器知道http.post()。然后...是否成功?

时间:2015-09-24 17:55:34

标签: angularjs ionic-framework angularjs-service angularjs-controller angular-controller

我有一个控制器,它使用以下行通过名为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 documentation says

  

$ http遗留承诺方法成功与错误已被弃用。请改用标准方法。如果$ httpProvider.useLegacyPromiseExtensions设置为false,则这些方法将抛出$ http / legacy错误。

我需要什么

现在在我的控制器中,我需要检查$http.post().then...是否成功,然后根据成功或失败做一些事情。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分: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` */ });

答案 1 :(得分: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处理服务中的回调相同的方式从控制器中调用它。

由于$http返回一个promise,但是使用promise chaining可以进一步简化它。这样就不需要使用额外的延迟对象了。

/**
 * 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.
    }
  );
}