【问题标题】:AngularJS controller promise Then is not a functionAngularJS控制器承诺然后不是一个函数
【发布时间】:2016-02-08 10:45:58
【问题描述】:

我在控制器中做出承诺时遇到了麻烦。

Plunker Editor Sample

这是包含模块、控制器和工厂的代码 当我调用Factory 并等待响应时,一切正常。

我在控制台中收到错误“然后不是函数” 但我不知道代码有什么问题

angular
    .module('sampleApp', [])
    .controller('SampleController', SampleController)
    .factory('myFactory', myFactory);

////////// FACTORY
    function myFactory () {

    var task = {
      getData : getData,
      counter:  0
    };

    return task;


    // Implementation details //
    // ---------------------- //

    function getData () {
      task.counter ++;
      var response = "FakeData";
      return response;
    }
  }

////////// CONTROLLER
  function SampleController (myFactory, $log) {
    $log.info("Sample controller initialized");

    var vm = this;
    vm.title = "SampleView";
    vm.callFactory = callFactory;
    vm.factoryResponse;

    callFactory();

    // Implementation details //
    // ---------------------- //

    function callFactory () {

      myFactory.getData()
      .then(function (data) {
        vm.factoryResponse = data;
        return vm.factoryResponse;

      })
      .catch(function () {
        $log.error("Ups! We cannot complete the request :(");
      });
    }
  }

【问题讨论】:

  • 当然,因为getData 不返回 Promise 对象。这个var secondString = ", sample factory value"; var response = randomParameter + secondString; return response; 的目的是什么?没有意义。
  • 我只是从我的真实应用程序中删除了一些东西,因为对于示例来说是不必要的,我编辑它们

标签: javascript angularjs controller factory


【解决方案1】:

因为你的工厂方法getData返回string。如果你想使用then,那么你的方法需要返回$promise。赞这个plunker

////////// FACTORY
function myFactory ($q) {

var task = {
  getData : getData,
  counter:  0
};
var defer = $q.defer();

return task;


// Implementation details //
// ---------------------- //
function getData (randomParameter) {
  task.counter ++;
  var secondString = ", sample factory value"
  var response = randomParameter + secondString;
  defer.resolve(response);
  return defer.$promise;
}}

更多关于angular $q

【讨论】:

  • 最好使用 $q.when 而不是 deferred。
  • 哦,谢谢!我理解诺言错了。以为 $q 仅用于工厂之间的承诺,例如。控制器调用 factory1 和 factory1 调用 factory2。好的,我会继续努力的:)
  • @dfsq 你可以添加一些链接吗?在官方文档docs.angularjs.org/api/ng/service/$q 中我没有看到 $q.when
猜你喜欢
  • 2014-04-15
  • 2017-12-09
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 2014-06-24
  • 2018-06-14
  • 1970-01-01
相关资源
最近更新 更多