Передача данных из обратного вызова в сервисе Angular

Я использую листовку AngularJS для поиска местоположения и получения координат широты и долготы. В моем сервисе я вызываю свой код для отображения карты в сервисе, я написал обратный вызов, который принимает (широта, долгота) и делает HTTP-запросы к URL-адресу для получения данных, связанных с этими координатами.

В идеале я хотел бы создать функцию, которая возвращает http-запрос и возвращает обещание в контроллере. Проблема в том, что getMarkets является обратным вызовом, и я не могу вызвать функцию .then напрямую, потому что ей нужно сначала передать координаты. Он возвращает данные, и я хотел бы знать, как передать данные, которые я получаю от ($ http (options)) в контроллер, чтобы я мог отображать ответ в представлении.

app.service('mapService', (function($http) {
    var fmCoordinates = {};

    var requestMarkets = function(lat,lng){
        var options = {
            type: "GET",
            contentType: "application/json; charset=utf-8",
            url: "http://somerul?lat=" + lat + "&lng=" + lng
        };
        return console.log($http(options));

    };


L.Control.Search = L.Control.extend({
//Leaflet Code
_getLocation: function(key) {   //extract latlng from _recordsCache
        var latLong = this._recordsCache[key];
        fmCoordinates.lat = latLong.lat;
        fmCoordinates.lng = latLong.lng;
        requestMarkets(fmCoordinates.lat,fmCoordinates.lng);
        if( this._recordsCache.hasOwnProperty(key) )
            return latLong;//then after use .loc attribute
        else
            return false;
    },
})

person Roscoe    schedule 21.05.2016    source источник
comment
как вы вызываете сервисную функцию с вашего контроллера, вы не добавили это.   -  person rashidnk    schedule 21.05.2016


Ответы (1)


https://docs.angularjs.org/api/ng/service/$q

var requestMarkets = function(lat,lng){
    var defer = $q.defer();
    var dataFromHttp = {};
    var options = {
        type: "GET",
        contentType: "application/json; charset=utf-8",
        url: "http://somerul?lat=" + lat + "&lng=" + lng
    };
    $http(options).then(function(result) {
        dataFromHttp = result.data;
        defer.resolve(dataFromHttp);
    }, function(error){
        defer.reject(error);
    });
    return defer.promise;

};

Затем внутри _getLocation

var promise = requestMarkets(fmCoordinates.lat,fmCoordinates.lng);
promise.then(function(yourData){...}, function(error){...});
person Passersby    schedule 21.05.2016
comment
Спасибо. Это возвращает обещание внутри службы. Проблема, я не могу получить доступ к getLocation. Он находится внутри этого объекта: L.Control.Search = L.Control.extend({ include: L.Mixin.Events, getLocation();}); Внутри контроллера он не распознает Control - person Roscoe; 25.05.2016
comment
Пожалуйста, избегайте отложенного анти-паттерна и используйте return $http(opts) - person Muli Yulzary; 29.06.2016