AngularJS .then不是函数()

时间:2016-09-13 11:13:48

标签: javascript angularjs promise

为什么我在承诺时调用.then会出现此错误?

  

vm.submitPromise(...)。然后不是函数

我的代码的简化版本是:

    var submitPromise = function($q) {
      return function() {
        var deferred = $q.defer();
        //$scope.ngSubmitFunction();    

        // simulated async function
        $timeout(function() {
          deferred.resolve('data received!')
        }, 2000);
        return deferred.promise;
      }
    }

    function ngSubmit($form) {
      vm.submitDisabled = true;
      submitPromise().then(function() {
          vm.submitDisabled = false;
      });
    };

这是管理表格的指令的一部分。目的是让Submit按钮调用可能有一个或多个异步调用的函数,我需要等待它们再次启用再次启用提交按钮。

几乎我读到的任何地方都会发生这种情况,当函数没有返回一个承诺时,但我的确如此(我相信)。不是吗?我错过了什么我正在尝试使用模拟异步函数$ timeout和.resolve进行调试(可以在代码中看到),但是我得到了同样的错误。

4 个答案:

答案 0 :(得分:2)

submitPromise正在返回一个函数,该函数又返回一个promise,但是你没有调用该函数。鉴于该方法的签名,您需要像这样使用它:

function ngSubmit($form) {
  vm.submitDisabled = true
  submitPromise()().then(function () {
    vm.submitDsabled = false
  })
}

您可能想要这样做:

var submitPromise = function($q) {
  var deferred = $q.defer();
  //$scope.ngSubmitFunction();    

  // simulated async function
  $timeout(function() {
    deferred.resolve('data received!')
  }, 2000);
  return deferred.promise;
}

请注意,不推荐使用延迟模式,$q(以及浏览器中的本机Promise实现)建议使用基于构造函数的模式:

function submitPromise($q) {
  return $q(function (resolve) {
    $timeout(function() {
      resolve()
    }, 2000)
  })
}

这样做的原因主要是因为您使用$q符合ES6规范,也意味着您不必强制管理承诺本身(这可能导致创作错误)。

答案 1 :(得分:0)

您正在返回一个函数,您需要返回一个承诺。

var submitPromise = function($q) {
    var deferred = $q.defer();
    // simulated async function
    $timeout(function() {
      deferred.resolve('data received!')
    }, 2000);
    return deferred.promise;      
}

OR ,您需要调用返回的函数,如

function ngSubmit($form) {
    vm.submitDisabled = true
        submitPromise()().then(function () {
        vm.submitDsabled = false
    })
}

答案 2 :(得分:0)

submitPromise返回一个函数。因此,你需要执行它

尝试以下

 function ngSubmit($form) {
      vm.submitDisabled = true;
      submitPromise()().then(function() {
          vm.submitDisabled = false;
      });
    };

答案 3 :(得分:0)

不是你的问题 - 你的函数只返回函数而不是promise但是......

var submitPromise = function(){
    return $timeout(function(){
         return data;
    }, 2000);
};

这是编写示例的正确方法