将异步函数传递给控制器​​时出现错误

时间:2019-01-31 04:51:18

标签: javascript angularjs

我是新来angulerjs。我不明白为什么这是行不通的。

type Deck = [Card]

运行此当我得到这个错误app.factory('jsonFactory',function ($http) { var factory = {}; factory.getCustomers = function () { return new Promise((resolve, reject) => { $http({ method: 'GET', url: `https://jsonplaceholder.typicode.com/todos` }).then(function (response) { resolve(response.data); }); }); } return factory; }) app.controller('JsonController', ['$scope','jsonFactory', async function ($scope, jsonFactory) { var data = await jsonFactory.getCustomers(); console.log(data); $scope.customers = data; $scope.$apply(); }]);

TypeError: Function.prototype.bind.apply(...) is not a constructor

但这很好用。这是为什么?我不能将异步功能传递给控制器​​吗?

1 个答案:

答案 0 :(得分:0)

您的代码可以这样重写:

app.factory('jsonFactory',function ($http) {
    var factory = {};
    factory.getCustomers = function () {
        return $http({
            method: 'GET',
            url: `https://jsonplaceholder.typicode.com/todos`
        }).then(function (response) {
            return response.data;
        });
    }
    return factory;
})

首先-不需要额外的Promise,因为$http已经是一个承诺!

第二,无需调用$scope.$apply。如果要在控制器启动时调用某些服务方法,则最好创建activate函数,从语义上讲更有意义。

app.controller('JsonController', ['$scope','jsonFactory', function ($scope, jsonFactory) {
    function activate() {
        jsonFactory.getCustomers().then(function (data) {
            $scope.customers = data;
        });
    }
    activate();
}]);

关于何时应致电$apply和如何致电article,这很不错。