【问题标题】:Returning asynchronous results from custom panoProvider从自定义 panoProvider 返回异步结果
【发布时间】:2012-02-16 11:53:10
【问题描述】:

我知道关于 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() 响应。

【问题讨论】:

    标签: javascript asynchronous google-maps-api-3 callback


    【解决方案1】:

    更改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        
    });
    

    【讨论】:

    • 感谢 Richard,但这就是问题所在 - 我无法编辑传递给 getCustomPanorama 的内容,因为它是从 Google 地图 API 中调用的函数。
    • @stml 那么是谷歌地图 API 对您传回的数据进行处理吗?有没有可以自己调用并传入数据的函数?
    • 我已经更新了上面的完整代码,所以你可以看到它是如何被调用的。我已经尝试修改调用,但它不起作用...
    【解决方案2】:

    panoProvider 不应该被异步调用。这意味着您必须拥有创建自定义 StreetViewPanoramas 预填充的所有必要信息。

    但如果你真的需要在panoProvider 内部调用client.getPanoramaById,那么有一个非常肮脏的技巧:

    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;
    }
    

    但是,我不鼓励你不要使用这个解决方案。最好尝试重新思考您的应用程序的逻辑。

    相关问题:Call An Asynchronous Javascript Function Synchronously

    【讨论】:

    • client.getPanoramaById 是 Google Maps API 提供的方法。但是getCustomPanorama() 似乎在你的控制之下。
    • getCustomPanorama() 在另一个 Google 函数中调用,定义自定义街景全景图。
    • 能否请您发布调用您的getCustomPanorama() 的代码?
    • 谢谢 - 了解这个解决方案,但它绝对不可行。我知道我正在做一些意想不到的事情,所以很感激可能没有好的答案......
    • @yatskevich - 你的答案是否有一个有效的 jsFiddle?
    猜你喜欢
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多