Flickr API - 获取图像ID并传递给第二个请求

时间:2015-08-17 12:17:38

标签: javascript arrays angularjs rest flickr

我正在使用Angular JS。我的目标是根据位置获取flickr图像列表,并从请求中返回图像ID并将其传递到另一个请求,以获取要在结果中显示的每张照片的更多信息。这是我的,但我似乎无法从我的第二个搜索功能返回正确的值。虽然这似乎是一个很长的问题,但我真的只想知道如何在我的第二个函数中获得正确的值,以便我可以将它分配给我的结果。

这是我的services.js

//flickr location search
APIRequest.fkrSearch = function(lat, lon, rad){
    fkrAPI = $resource('https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=5956ffe850b325e0b121525800af5b31&lat='+lat+'&lon='+lon+'&radius=5km&format=json&nojsoncallback=1', { dataType: 'jsonp', jsonp: 'jsoncallback' });
    return fkrAPI.get().$promise.then(function (data){
        console.log(data);
        return data;
        });
    }; 

这是我在控制器内的请求。

$scope.resultPosts = []; //global variable to hold results

    if ($scope.locationSearch.dataSource.fkr){
                $scope.fkrLoading = true;
                console.log('search Flickr');
                OSINTAPIRequest.fkrSearch($scope.lat, $scope.lng, $scope.radius).then(function(data){
                    if (data.error){
                            toastr.error(data.error.error_msg, 'Flickr Error['+data.error.error_code+']');
                        } else {
                            if (data.photos.photo.length > 0){
                                var fkrAppend = 0;
                                for(var i=0; i < data.photos.photo.length; i++){
                                    fkrAppend++;

                                    var fkrImageId = data.photos.photo[i].id;

                                    $scope.resultPosts.push({
                                                        SourcePostID: data.photos.photo[i].id,
                                                        Timestamp: '',
                                                        PostLatitude: $scope.fkrGetLatLng(data.photos.photo[i].id),
                                                        PostLongitude: $scope.fkrGetLatLng(data.photos.photo[i].id),
                                                        PostMedia: 'https://farm'+data.photos.photo[i].farm+'.staticflickr.com/'+data.photos.photo[i].server+'/'+data.photos.photo[i].id+'_'+data.photos.photo[i].secret+'.jpg',
                                                        PostType: 'image',
                                                        PostAvatar: 'https://pingendo.github.io/pingendo-bootstrap/assets/user_placeholder.png',
                                                        PostMarker: 'assets/img/fkrMarker.png',
                                                        DataSource: 'flickr',
                                                        Display:$scope.resultFilter.fkr

                                        });

                                } 

此函数返回给定lat / long中地理标记的照片的图像ID列表,但不返回结果中的实际位置数据,以便传递给结果并在地图上绘制点。所以你会在我的resultsPosts.push中看到我试图用这行(PostLatitude: $scope.fkrGetLatLng(data.photos.photo[i].id))将返回的图像Id传递给fkrGetLatLng函数......函数看起来像这样。

$scope.fkrGetLatLng = function (fkrImageId){
        OSINTAPIRequest.fkrGetLatLong(fkrImageId).then(function(data){
            var fkrLat = data.photo.location.latitude;
            var fkrLng = data.photo.location.latitude;
            //console.log (fkrLat+','+fkrLng);
            return fkrLat;

    });
}

这是JS服务中的请求。我为每个请求获取了正确的数据,但它没有为PostLatitude分配正确的值(或任何值)。

    //flickr location search - get lat long
    APIRequest.fkrGetLatLong = function(fkrImageId){
        fkrAPI = $resource('https://api.flickr.com/services/rest/?method=flickr.photos.geo.getLocation&api_key=5956ffe850b325e0b121525800af5b31&photo_id='+fkrImageId+'&format=json&nojsoncallback=1', { dataType: 'jsonp', jsonp: 'jsoncallback' });
        return fkrAPI.get().$promise.then(function (data){
            //console.log(data);
            return data;
        });
    };

1 个答案:

答案 0 :(得分:0)

您调用以分配lat / long值的函数是异步的,因此我相信您将在解析之前进行分配。尝试先获取数据,一旦检索到数据,请分配数据,如下所示:

  var fkrImageId = data.photos.photo[i].id;
  $scope.fkrGetLatLng(data.photos.photo[i].id).
  then(function(data){
      $scope.resultPosts.push({
                SourcePostID: data.photos.photo[i].id,
                Timestamp: '',
                PostLatitude: data.lat,
                PostLongitude: data.long,
                PostMedia: 'https://farm'+data.photos.photo[i].farm+'.staticflickr.com/'+data.photos.photo[i].server+'/'+data.photos.photo[i].id+'_'+data.photos.photo[i].secret+'.jpg',
                PostType: 'image',
                PostAvatar: 'https://pingendo.github.io/pingendo-bootstrap/assets/user_placeholder.png',
                PostMarker: 'assets/img/fkrMarker.png',
                DataSource: 'flickr',
                Display:$scope.resultFilter.fkr

      });

 });