Restangular 运行 onFulfilled 承诺回调,即使承诺被拒绝

Restangular running onFulfilled callback on promise even when promise is rejected

我正在将我的主题数据移动到服务中并尝试智能化代码,但我 运行 遇到了一些问题。

当我关闭 API 服务器和 运行 创建函数时,我希望只触发 onRejected 回调。 onFulfilledonRejected 回调都被触发了。

服务

(function(){
  'use strict';

  angular
  .module('app')
  .factory('$cmSubjectData', $cmSubjectData);

  function $cmSubjectData($log, Restangular, $mdToast) {

    var service = {
      getAll: getAll,
      getById: getById,
      update: update,
      create: create,
      destroy: destroy
    };

    return service;

    function getAll() {
      return subjects().getList().then(handleSuccess, handleError('Error getting all subjects'));
    }

    function getById(id) {
      return subjects().one(id).get().then(handleSuccess, handleError('Error getting this subject'));
    }

    function update(subject) {
      Restangular.all('subjects')
      .post(subject)
      .then(handleSuccess, handleError('Error updating subject'));
    }

    function create(subject) {
      Restangular.all('subjects')
      .post(subject)
      .then(successToast(subject.basicInfo.firstName + ' has been created'), handleError('Error creating subject'));
    }

    function destroy(id) {
      var subject = subjects().one(id);
      subject.remove()
      .then(successToast('Subject has been deleted!'), handleError('There was an error deleting this subject'));
    }

    // Private Functions
    function subjects() {
      return Restangular.service('subjects');
    }

    function handleSuccess(data) {
      $log.info('Success');
      return data;
    }

    function handleError(error) {
      return function () {
        $log.warn(error);
      };
    }

    function successToast(content) {
      $mdToast.show(
        $mdToast.simple()
        .content(content)
      );
    }

  }

})();

控制器

(function() {
  'use strict';

  angular
  .module('app')
  .controller('SubjectNewCtrl', SubjectNewCtrl);

  function SubjectNewCtrl($cmSubjectData) {

    var vm = this;

    vm.subject = {};
    vm.createSubject = $cmSubjectData.create;

  }

})();

查看调用函数的位置:

<button ng-click="vm.createSubject(vm.subject)">Add</button>

如有任何帮助,我们将不胜感激。

当你

.then(successToast(...))

你立即 运行 successToast(...) 并将 return 值从那个传递给 .then() 这不是你想要的时间。请记住,如果您希望稍后执行它,您必须将函数引用传递给 .then()。如果您在函数中包含括号 (),那么这会告诉 Javascript 立即执行您的函数。在这种情况下,这不是您想要的。如果你没有额外的函数参数,你可以这样做:

.then(successToast)

但是,因为您在调用它时有想要传递的参数,所以您不能那样做。所以,你有两个选择。你可以让它像 handleError() 一样工作,其中使用参数调用它只是 returns 一个函数(所以这就是像这样传递给 .then() 的东西:

function successToast(content) {
  return function() {
      $mdToast.show($mdToast.simple().content(content));
  }
}

然后,它会像您一样接到电话:

.then(successToast(subject.basicInfo.firstName + ' has been created'))

或者您可以在调用本身中插入您自己的存根函数引用:

.then(function() {
    return successToast(subject.basicInfo.firstName + ' has been created');
});

这两个示例都将函数引用传递给 .then(),并且直到稍后 .then() 调用该函数引用时才执行您的逻辑核心。