Почему я должен использовать return дважды и как это работает?

0

Я написал обертку для службы $ http в угловом использовании службы. Почему я должен вернуть bothe http-вызов и мой результат, чтобы он был доступен в контроллере?

это функция в сервисе:

this.fetchData = function(url, parameters)
    {
        if (parameters)
        {
            return $http.get(url, {params: parameters}).then(
                function (response) {
                    console.log(response);
                    return response.data.data;
                },
                function (response) {
                    console.log(response);
                });
        }
        else
        {
            return $http.get(url).then(
                function (response) {
                    console.log(response);
                },
                function (response) {
                    console.log(response);
                }
            );
        }
    }

и вот где я называю это в контроллере:

test.fetchData('/jewelry-room/move-user.action', {user:2000, task:7}).then(
        function (response) {
            console.log(response);
        },
        function (response) {
            console.log(response);
        }
    );
  • 0
    «Почему я должен использовать return дважды» - потому что это две разные функции, из которых вы будете возвращаться (и в разное время, я должен добавить).
Теги:

2 ответа

1
Лучший ответ

Потому что то, что вы возвращаете с фабрики, является обещанием: return $http.get().then(). Так как ваш завод имеет функцию обратного вызова внутри, then, обетование разрешено. В этом случае функция внутри контроллера, then блок, не будет вызываться.

Вам нужно вернуться снова, чтобы получить доступ к данным ответа внутри контроллера.

Кроме того, просто верните $http.get() с фабрики.

0

Вы можете просто вернуть обещание своему контроллеру, используя $ q:

var fetchData = function (url, params) {
    if (params) {
        var deferred = $q.defer();
        $http.get(url, {params: params}).success(deferred.resolve).error(deferred.reject)
        return deferred.promise;
    } else {
        var deferred = $q.defer();
        $http.get(url).success(deferred.resolve).error(deferred.reject)
        return deferred.promise;
    }
}

Тогда внутри вашего контроллера вы сможете справиться с обещанием.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню