Разрешение обещания передает обещание вместо значения

У меня есть обратный вызов успеха, настроенный для значения, возвращаемого из службы, но когда я ссылаюсь на значение, это обещание, а не простой тип (логический), как я ожидал. Вот основная структура кода:

var ZService = $resource('api/w/:id/zs'); // returns a list of Zs
var XService = $resource('api/x/:id/hasAttribute'); // returns a boolean value
$scope.zList = ZService.query({id:$scope.w.id});
$scope.zList.$promise.then(function(zs) {
    for(var i=0; i<zs.length; i++) {
        (function(i) {
            var z = zs[i];
            XService.get({id:z.x.id}).$promise.then(function(has) {
                console.log("has: " + has);
                z.attr = has;
            });
        })(i);
    }
}

На мой взгляд, я использую <span ng-show="z.attr == true"> (внутри повторителя z in zList), и этот диапазон никогда не отображается. Если я запишу значение has в консоль, это покажет, что это обещание, а не логическое значение, как я ожидаю. Точно так же, если я проверю значение z.attr в отладчике, это объект (разрешенное обещание).

Я использовал промисы в других местах своего кода, и у меня не было проблем, но большую часть времени я присваивал возвращаемое значение переменной в $scope, поэтому мне интересно, происходит ли какая-то магия. за кулисами. В других местах я возвращаю составные объекты, а не простые значения, поэтому мне также интересно, имеет ли это какое-то отношение к этому.


person TMN    schedule 21.01.2016    source источник
comment
Похоже, это только часть кода. Также отсутствует по крайней мере одна скобка после второго then(). Зачем вам сразу вызываемая функция? Можете ли вы опубликовать код в контексте? Что именно возвращается с сервера (буквально)? Куда вы выводите значения в консоль?   -  person lex82    schedule 22.01.2016
comment
Да, фактический код составляет около пятидесяти строк и содержит кучу несвязанных вещей, я попытался сократить его и обобщить, чтобы более четко объяснить структуру. Мне нужен IIFE, потому что в противном случае он создает замыкание в цикле, и я получаю результаты только для последнего элемента в списке. Я отредактировал пример, чтобы показать, где выполняется регистрация.   -  person TMN    schedule 22.01.2016
comment
Если это настоящий код, это означает, что XService использует собственную, ошибочную реализацию промисов.   -  person Tamas Hegedus    schedule 22.01.2016


Ответы (1)


Проблема в том, что $resource ожидает объект или массив объектов. Он не работает с примитивными значениями. Когда он извлекает объект, он добавляет удобные методы, такие как $save, которые в противном случае были бы невозможны.

Подробнее см. этот ответ на соответствующий вопрос.

person lex82    schedule 22.01.2016