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

时间:2015-08-23 03:43:33

标签: javascript angularjs restangular

我正在将我的主题数据移动到服务中并试图了解代码,但我遇到了一些问题。

当我关闭我的API服务器并运行create函数时,我希望只触发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>

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

当你这样做时

.then(successToast(...))

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

.then(successToast)

但是,因为你在调用时想要传递参数,所以你不能这样做。所以,你有两个选择。你可以使它像handleError()那样工作,用参数调用它只返回一个函数(这就是传递给.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()调用该函数引用之后才会执行逻辑核心。

相关问题