【问题标题】:Returning objects through Asynchronous calls in JavaScript通过 JavaScript 中的异步调用返回对象
【发布时间】:2011-11-29 06:56:02
【问题描述】:

我正在开发一个 Pure Java 程序,它采用 文本 形式的 地址 并将其传递给 Google Map API 用于进一步细分国家、州和邮编

但我被困在某个地方,我的 Java 程序抛出异常导致尴尬的结果。

现在我决定使用 java 将它与 Rhino 集成。 这是因为我成功开发了一个网页,它接受一个字符串并在 Country、State 和 Zip 中解析它。 所以现在我的想法是,我将使用 Rhino 将这个 JavaScript 文件集成到我的 Java 文件中。

           function showLocation(address) {
                var geocoder;
                if(!geocoder){
                    alert("GC is initialised");
                    geocoder = new GClientGeocoder();
                }

                geocoder.getLocations(address , function(response)
                     {
                        if (!response || response.Status.code != 200) {alert("Sorry, unable to locate that address");}
                        else {
                          place = response.Placemark[0];
                        }
                     }//END OF CALLBACK METHOD
                );//END OF GETLOCATIONS
           }//end of showLocation

现在我的问题是当我调用 showLocations()

时如何返回 place 的对象

【问题讨论】:

  • 您正在使用嵌入在 Java 应用程序中的 Rhino Javascript 解释器中运行的 Javascript,因为您的 Java 应用程序有问题?解决您的 Java 问题不是比引入更多复杂性更好吗?
  • 你是 100% 正确的@FrancisAvila,但我尝试了几乎所有我知道的方法,但异常仍然存在。所以我改变了场景并决定使用 Rhino。
  • 你应该在 StackOverflow 上问 那个 问题。你好像没有。
  • 好的 @FrancisAvila 我也一定会这样做的,再次感谢您的精彩信息。

标签: javascript google-maps


【解决方案1】:

你不能!因为getLocations是异步的,所以showLocationresponse可用之前就已经完成了执行。

您需要接受对showLocation 的回调。还有一些其他问题我会在下面解决。

function showLocation(address, callback) {
    var geocoder = new GClientGeocoder(); // no need for !geocoder test--it will always be undefined!

    geocoder.getLocations(address , function(response) {
        if (!response || response.Status.code != 200) {
            alert("Sorry, unable to locate that address");
        } else {
            // you forgot the "var" before "place"--you were making a global variable "place"
            var place = response.Placemark[0];
            if (callback) callback(place);
        }
    });
}

然后你让用户像这样提供一个回调:

function placeCallback(place) {
    // do something with place object here
}
showLocation('my address', placeCallback);

【讨论】:

  • 所以这意味着我不能从这个概念中返回一个对象并将它与 Rhino 一起使用?
  • 你可以从showLocation()返回任何你想要的东西,但是你不能返回还不存在的东西!
  • 因此,如果我将您的 callBack 概念与showLocation('myAddress',placeCallBack) 一起使用,我将如何获取返回的对象,因为我将调用 showLocation('ABC','placeCallBack' ) 从我的 JAVA 代码中调用 placeCallBack 返回我的 Object ?
  • 您应该创建一个新问题来回答这个问题,因为这会进入您根本没有描述的 Rhino 嵌入环境。查看the Rhino Embedding Tutorial,您似乎至少有两个选择:将需要place 的Java 对象公开给Javascript 并在您的placeCallback 中调用它,或者在评估您的脚本后检查范围对象。
  • 但是,我真的认为您应该退后一步,首先评估一下为什么要嵌入 Javascript 解释器。也许您可以解决您最初的 Java 异常问题并避免使用 Rhino?
猜你喜欢
  • 1970-01-01
  • 2020-08-14
  • 2020-11-09
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2017-02-06
  • 2016-07-10
相关资源
最近更新 更多