【问题标题】:Error success is not a function in Angularjs错误成功不是Angularjs中的功能
【发布时间】:2016-08-01 10:36:49
【问题描述】:

我的代码遇到问题,我不明白它出了什么问题.. 有趣的是,api 调用得很好,但它没有进入success 函数 orders.pay(ss($scope.ss, $scope.oo)) .success(function (data) {

angular.module('services.orders', ['users.service'])
  .factory('orders', ['$http', 'user', '$q', function ($http, user, $q) {
    'use strict';

function genericSuccess (res) {
      return res.data.data; // yes, really.
    }


function pay (payment) {
      return $http.post('v1/payment/authorize', payment)
        .then(genericSuccess);
    }



orders.pay(ss($scope.ss, $scope.oo))
          .success(function (data) {

    //It should called success either it should gone to error but it says
    //Error:orders.pay(...).success is not a function
    //can any one suggest how to solve it

            notify.message('Thank you!');
          }).error(function (data) {
          notify.message('Error: ' + data.data.message);
        });

【问题讨论】:

  • orders 函数是什么样的?如果可以,请发布它。
  • .success.error 已被弃用,即使这不是您的问题的原因,您也应该避免使用它们。请改用.then.catch

标签: angularjs


【解决方案1】:
function genericSuccess (res) {
  return res.data.data; // yes, really.
}

function pay (payment) {
  return $http.post('v1/payment/authorize', payment).then(function(success) {
    return genericSuccess(success);
  });
}

试一试,看看是否更好?

【讨论】:

    【解决方案2】:

    正如您在角度文档https://docs.angularjs.org/api/ng/service/$http中看到的那样

    successerror 不再可用。 如果您仍想在代码中使用.success.error,您可以执行以下操作:

    angular.module('services.orders', ['users.service'])
      .factory('orders', ['$http', 'user', '$q', function ($http, user, $q) {
        'use strict';
    
        function genericSuccess(res) {
          return res.data.data; // yes, really.
        }
    
    
        function pay(payment) {
          var successCallback, errorCallback;
          function successFn(callback) {
            if (typeof callback == 'function'){
              successCallback = callback;
            }
    
            return successErrorResponse;
          }
    
          function errorFn(callback) {
            if (typeof callback == 'function') {
              errorCallback = callback;
            }
    
            return successErrorResponse;
          }
    
          var successErrorResponse = {
            success: successFn,
            error: errorFn
          };
    
    
          $http.post('v1/payment/authorize', payment)
            .then(
              function (response) {
                if(successCallback) {
                  successCallback(response)
                }
              },
              function (response) {
                if(errorCallback) {
                  errorCallback(response)
                }
              });
    
    
    
    
          return successErrorResponse;
    
    
        }
    
    
        orders.pay(ss($scope.ss, $scope.oo))
          .success(function (data) {
    
            //It should called success either it should gone to error but it says
            //Error:orders.pay(...).success is not a function
            //can any one suggest how to solve it
    
            notify.message('Thank you!');
          }).error(function (data) {
          notify.message('Error: ' + data.data.message);
        });
    
      }])
    

    但你真的应该采用新的 angular api。

    【讨论】:

    • 嗨 Daniele 你能回答这个问题吗:stackoverflow.com/questions/44369082/…
    • 我想知道他们是否有任何其他具体原因要重命名这些函数,而不仅仅是简单地重命名它们。
    【解决方案3】:

    您遇到的问题是 .success.error 是一个包装器,这是一个只有 $http 公开的抽象,而不是核心承诺对象。

    问题是从$http 返回的promise 被扩展为具有这些额外的属性,但随后的promise 没有。您的服务中的第一个 .then 正在返回一个没有 .success 方法的正常承诺。

    这是它已被弃用的原因之一,您应该改用 .then.catch

    所以这会起作用:

    $http.get().success().then();

    但这不会:

    $http.get().then().success();

    但是你真的应该这样做:

    $http.get().then().then();

    请看下面的小提琴Fiddle

    希望这是有道理的。

    【讨论】:

      猜你喜欢
      • 2017-05-02
      • 2017-07-13
      • 1970-01-01
      • 2013-09-20
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多