Получение ошибки при передаче асинхронной функции в контроллер - PullRequest
0 голосов
/ 31 января 2019

Я новичок в angulerjs.Я не понимаю, почему это не работает.

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

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

}]);

Но это работает отлично.это почему?Не могу ли я передать асинхронную функцию на контроллер?

1 Ответ

0 голосов
/ 31 января 2019

Ваш код можно переписать следующим образом:

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 и как.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...