А расскажeте про promise и $resource?

Чего то я совсем не понимаю.
Есть данные в json файле. Ну или в базе, не суть..
[{
  "id" : "34234234234234234",
  "name" : "Peter"
},
  {
    "id" : "566464645643643",
    "name" : "Max"
  }]

Я хочу их забирать и, соответственно, обрабатывать. Делаю сервис
(function () {
    'use strict';

    angular
        .module('data')
        .service('dataService', dataService);

    dataService.$inject = ['$resource'];
    function dataService($resource) {
        this.getData = getData;

        var resource = $resource('server/data.json');
        ////////////////

        function getData() {
            return resource.query();
        }
    }
})();

В контроллере я забираю
function DataListController(dataService) {
        var vm = this;
        vm.data = dataService.getData();
    }

и с помощью ng-repeat вывожу значения. Всё нормально, выводятся имена, как положено. Но что означает это
0be9e5b3a69f4fcdab6abda6182b5085.png
Ну т.е. в каком promise есть 0:Resource и 1:Resource с моими данными
Зачем это вообще нужно? Почитал про промисы - ну да, ну можно сделать либо resolved, либо reject, а зачем?
И можно ли перебирать этот "объект" с помощью всяких forEach и прочих циклов? Вот хочу я получить массив всех первых букв имен в моей базе - как это сделать?
Почитал эту статью , но прям в начале "...Как только promise становится разрешен или отвергнут, его состояние уже не может измениться, что обеспечивает неизменность состояния в течение какого угодно числа проверок. Что не означает, что на разных этапах проверок вы получите одно и тоже значение.."
Моей логике недоступна эта фраза - оно не может измениться, но это не означает, что значения будут теми же самыми.
Можно как то просто получать то что есть в базе (json файле) {'id':'werwer','name':'Max'}и с этим и работать? В чем цимус?
  • Вопрос задан
  • 1245 просмотров
Решения вопроса 2
mudrick
@mudrick
Máximo progreso hemos alcanzado en minimo seso.
Первое — чтобы преобразовать ангуларовский объект (в котором есть всякие одно- и двудолларовые параметры, все эти $xxx и $$xxx) в нормальный (т.н. raw json) нужно использовать стандартные ангуларовские методы из коробки:
angular.fromJson(response)
и
angular.toJson(response)

Просто поковыряйте эти функции и посмотрите, что они вернут.

По поводу промисов. Когда вы вызываете какой-либо $resource-метод, например, .query(), то вам сразу же, моментально, возвращается объект с двумя параметрами — $promise и $resolved: false. После того, как ресурс получил данные, в ваш объект с двумя параметрами добавляется ещё куча данных (ну, json-данные, что вам вернул сервер), а параметр $resolved становится true.

Так вот $promise нужен тогда, когда после загрузки данных вам нужно что-то сделать :) Ведь когда вы послали запрос, вы не знаете, когда придет ответ, а $promise знает и позволяет вам что-нибудь сделать именно после загрузки. Обращаться к промису нужно так:
vm.data = dataService.getData().$promise.then(success, error);

function success(resource) {
    // тут не данные в resource, а объект $resource с данными, тут можно почистить его через angular.fromJson и т.п.
}

Тут, после получения данных, ваш vm.data сразу же пополняется данными ответа (и вы там что-то выводите через ng-repeat — Ангулар там сам понимает, что выводить нужно только ваши данные, и не выводит еще два параметра $promise и $resolved, хотя они в объекте присутствуют, как вы уже в console.log вывели и убедились), а в функции success можно еще что-нибудь сделать.

Можно так же сразу и не присваивать vm.data ничего, а сначала сделать какие-то действия в success и только потом присвоить, вот так:
dataService.getData().$promise.then(success, error);

function success(resource) {
    // тут не данные в resource, а объект $resource с данными, тут можно почистить его через angular.fromJson и т.п.
    // сначала что-нибудь делаем с полученными данными, а потом присваиваем их в скоуп
    vm.data = transformMyData(resource);
}
Ответ написан
AMar4enko
@AMar4enko
Основная идея ресурса в том, что объект, получаемый от сервера (одиночный либо список)
будет являться "потомком" вашего объекта-ресурса.
Т.е. можно делать так:
var Person = $resource(...);
Person.prototype.fullName = function() { return this.firstName + this.lastName; }

Person.query().$promise
  .then(function(response) {
    return response[0].fullName(); // Прототипом каждого элемента в списке будет Person   
  });


Промисы нужны для того, чтобы эффективно управлять потоком выполнения асинхронного кода.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
прочитайте нормальную стратью про промисы
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы