-1

Заранее прошу прощения - ответы на похожие вопросы нашел, но понимания не появилось.

Есть сервис api с методом request

Есть модуль с контроллером, в котором его использую

(function (angular) {
    "use strict";
    angular.module('manage_order', ['ngMaterial', 'network'])
           .controller('manage_order',
               ['$scope', 'api',
                function ($scope, api) {
                    $scope.statuses = [];

                    api.request('GetStatuses', {}, function (data) {
                        $scope.statuses = data; 
                    });
                }]);
}(window.angular));

Собственно в подавляющем числе случаев callback, передаваемый в метод сервиса представляет из себя банальное маппирование:

api.request('SomeRestMethod', {}, function (data) {
    $scope.someField = data; 
});

Хочется переписать сервис таким образом, чтобы он мог принимать не callback, а целевое поле(т.е. фактически передача переменной по ссылке), как-то так:

api.request('SomeRestMethod', {}, $scope.someField);

Да, я знаю, что в JS переменные по ссылке не передаются(?), но может есть какие обходные решения, позволяющие реализовать подобное?

rjhdby
  • 13,850
  • можно передавай объект и имя ключа – nörbörnën Nov 29 '18 at 11:03
  • @nörbörnën ,$scope, 'someField')? да, думал, но это дополнительный параметр, который, к тому же, будет абсолютно одинаковым вообще для всех вызовов. Ну и потом, если мне понадобится забиндить к $scope.someCategory.someSubCategory.someField? – rjhdby Nov 29 '18 at 11:31
  • да, я это имел ввиду. но вообще сервисы так не делаются. ты делаешь сервис, который знает как получать данные и на стороне контроллера его используешь: ApiService.getSomething().then((r) => $scope.someField = r), обычно сервис не должен знать о том что такое твой текущий скоп. – nörbörnën Nov 29 '18 at 11:35
  • Пожалуйста, кто переоткрывает вопрос, оставляйте комментарий. Спасибо. – 0xdb Dec 06 '18 at 09:27
  • @0xdb я переоткрывал, поскольку в предложенном дубликате не увидел: 1) указанной в данном вопросе специфики 2) подходящего ответа(либо его надо долго и нудно оттуда выковыривать). Это все равно как на вопрос "оторвался проводок - как спаять?" отвечать началами сопромата – rjhdby Dec 06 '18 at 09:39
  • @rjhdby, у тебя в вопросе, по крайней мере в примерах, все сводится к коду, который нужен для получения значения из асинхронной функции, следовательно все можно заменить на async-await, что-то вроде: $scope.statuses = await api.request('GetStatuses'). О чем и сказано в ответах на вопрос дубликат. – Grundy Dec 06 '18 at 10:01
  • @Grundy 1) мне, как полному чайнику в JS это совершенно не очевидно, и, соответственно, гуглу я бы вопрос в такой интерпретации не задал бы. 2) вопрос не про получение значения из асинхронной функции, а в возможности, в максимально краткой и наглядной форме, указать ей, куда этот ответ положить, с оглядкой на используемый фреймворк – rjhdby Dec 06 '18 at 10:07
  • @rjhdby, ну чтобы положить ответ, его ж надо получить сначала? :-) – Grundy Dec 06 '18 at 10:08
  • @Grundy зачем? Пусть его асинхронная функция получит и сама сложит в коробочку. Я тут вообще звено лишнее и не хочу работать передатчиком между функцией и коробочкой :P. – rjhdby Dec 06 '18 at 10:09
  • @rjhdby, собственно async/await и позволяет тебе использовать функцию как коробочку которая тебе значение дает и ты с ним что-то делаешь, в противном случае, сервис начинает зависеть от того, что ему передадут, вместо простого возвращения значения, callback в этом случае выглядит чище, чем передача объекта и строки: простая опечатка, и ошибку не найдешь – Grundy Dec 06 '18 at 10:15

1 Answers1

0

Сделал так.

В сервисе добавил

...
    scope          : null,
    bind           : function (scope) {
        this.scope = scope;
        console.log(this);
        return this;
    },
...

В сервисе, функции запроса добавил проверку

if (typeof callback === "function") {
    callback(data.r);
} else if (typeof callback === "string") {
    this.scope[callback] = data.r;
}

Ну и, соответственно, вызываю так

api.bind($scope);
api.request('GetStatuses', {}, 'someField');
rjhdby
  • 13,850