Возврат асинхронных результатов из пользовательского panoProvider - PullRequest
2 голосов
/ 16 февраля 2012

Я знаю, что есть много, много ответов на этот вопрос о SO, но я не смог найти тот, который применим в этом случае.Я делаю асинхронный вызов в службу Google и должен вернуть результат:

function getCustomPanorama(pano,zoom,tileX,tileY) {
    client.getPanoramaById(pano, function(result, status) {
        return {
            location: result.location,
            links: result.links,
            copyright: result.copyright+' BUT GREY',
            tiles: {
                tileSize: result.tiles.tileSize,
                worldSize: result.tiles.worldSize,
                centerHeading: result.tiles.centerHeading,
                getTileUrl: getCustomPanoramaTileUrl
                }
            };
        });
    }

Я понимаю, что вышеупомянутое неверно и не вернется, и думаю, что мне нужно использовать обратные вызовы, но я нене понимаю где.Обратите внимание, что я не могу изменить то, что передается getCustomPanorama.Вся помощь с благодарностью получена.

ОБНОВЛЕНИЕ: Полный код:

var panorama;
var client;

$(document).ready(function() {
    var panoramaOptions = {
        position: new google.maps.LatLng(51.52241608253253, -0.10488510131835938),
        panoProvider: getCustomPanorama
        };
    client = new google.maps.StreetViewService();
    panorama = new google.maps.StreetViewPanorama(document.getElementById("pano"), panoramaOptions);
    });

function getCustomPanorama(pano,zoom,tileX,tileY) {
    client.getPanoramaById(pano, function(result, status) {
        return {
            location: result.location,
            links: result.links,
            copyright: result.copyright+' BUT GREY',
            tiles: {
                tileSize: result.tiles.tileSize,
                worldSize: result.tiles.worldSize,
                centerHeading: result.tiles.centerHeading,
                getTileUrl: getCustomPanoramaTileUrl
                }
            };
        });
    }

ОБНОВЛЕНИЕ 2:

Предположительно, я пытаюсь сделать что-то невозможное, поэтому пытаюсь сделать другоеподход, предусматривающий предварительное кэширование ответов getPanoramaByID ().

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Измените getCustomPanorama, чтобы получить дополнительный параметр для обратного вызова и передать функцию, которая делает то, что вам нужно сделать с результатом:

function getCustomPanorama(pano,zoom,tileX,tileY,callback) {
    client.getPanoramaById(pano, function(result, status) {
        var data = {
          location: result.location,
          links: result.links,
          copyright: result.copyright+' BUT GREY',
          tiles: {
              tileSize: result.tiles.tileSize,
              worldSize: result.tiles.worldSize,
              centerHeading: result.tiles.centerHeading,
              getTileUrl: getCustomPanoramaTileUrl
          }
        };
        callback(data); // call the function and pass in the data you would have returned
    });
}

getCustomPanorama(pano,zoom,tileX,tileY,function(data) {
    // do something with the results of the asynchronous call here        
});
1 голос
/ 16 февраля 2012

panoProvider не должен вызываться асинхронно.Это означает, что у вас должна быть вся необходимая информация для создания пользовательских StreetViewPanorama предварительно заполненных.

Но если вам действительно нужно вызвать client.getPanoramaById внутри panoProvider, то есть очень грязный трюк:1007 *

function getCustomPanorama(pano,zoom,tileX,tileY) {
  var resultFromAsyncCall;
  client.getPanoramaById(pano, function(result, status) {
    resultFromAsyncCall = {
        ...
        copyright: result.copyright+' BUT GREY',
        tiles: {
          ... 
          getTileUrl: getCustomPanoramaTileUrl
        }
    };
  });

  while (!resultFromAsyncCall) {
    //wait for result
  }   
  return resultFromAsyncCall;
}

НО , я не рекомендую вам использовать это решение.Лучше попытайтесь переосмыслить логику вашего приложения.

Связанный вопрос: Синхронно вызвать асинхронную функцию JavaScript,

...