Angular - фабрика должна возвращать значение из стороннего обратного вызова

0

В настоящее время я пытаюсь написать угловое обслуживание для обработки стороннего API. Объект API обрабатывает все. Вы просто создаете объект, вызываете на нем функцию и получаете полезную нагрузку. Когда я выполняю функцию обслуживания в отладчике, я могу увидеть ответ JSON внутри функции findRole, но затем он ошибочно:

TypeError: Cannot read property 'then' of undefined

Любые идеи о том, как сделать эту работу?

модуль

var angular = require('angular'),
    govtracksvc = require('./rep.service'),
    Rep = require('./Rep'),
    govtrack = require('govtrack-node');

angular.module('RepresentativeApp', [])
    .value('govtrack', govtrack)
    .factory('govtracksvc', govtracksvc)
    .controller('Rep', Rep);

module.exports = angular.module('RepresentativeApp');

контроллер

module.exports = function Rep (govtracksvc) {
    var rep = this;
    rep.list = govtracksvc.findRole(rep.govtrack);
};

обслуживание

module.exports = function govtracksvc(govtrack) {
    var rep = this;
    var data = {};
    govtrack.findRole({current: true}, function (err, res) {
        if (err) {
            console.log('err: ', err);
        }
        return res;
    }).then(function (res) {
        data = res.objects;
    });
    return data;
};

Вот конечная точка, если кто-то захочет увидеть данные: https://www.govtrack.us/api/v2/role/?current=true

  • 0
    Можете ли вы поделиться реализацией govtrack.findRole. Проблема может быть там
  • 0
    @iLoveJS Это сторонний код, и, как я уже говорил, я вижу ответ в отладчике. Если я проверю ответ до того, как он попадет в строку .then (), пакет будет виден.
Показать ещё 8 комментариев
Теги:
callback
rest

1 ответ

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

Вот пример кода с использованием обратного вызова, посмотрите, подходит ли он для вашей потребности:
модуль

var angular = require('angular'),
govtracksvc = require('./rep.service'),
Rep = require('./Rep'),
govtrack = require('govtrack-node');

angular.module('RepresentativeApp', [])
    .value('govtrack', govtrack)
    .factory('govtracksvc', govtracksvc)
    .controller('Rep', Rep);

module.exports = angular.module('RepresentativeApp');

контроллер

module.exports = function Rep (govtracksvc, $scope) {
    var rep = this;
    govtracksvc.findRole(rep.govtrack, function(result){
        rep.list = result;
        if(!$scope.$$phase){
            $scope.$apply();
        }
    });
};

обслуживание

module.exports = function govtracksvc(govtrack, callback) {
var rep = this;
govtrack.findRole({current: true}, function (err, res) {
    if (err) {
        console.log('err: ', err);
        return {};
      }
    return res.objects;
    });
};
  • 0
    Что это? if (! $ scope. $$ phase) {$ scope. $ apply (); }
  • 0
    Иногда при выполнении асинхронных вызовов угловая область применения / обновления не происходит, поэтому в этом случае этот код делает это вручную для вас, так что вы получаете мгновенный эффект для пользовательского интерфейса. Вот знаменитый блог об этом: ruoyusun.com/2013/05/25/…
Показать ещё 2 комментария

Ещё вопросы

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