1

我只想创建一个动态 URL。我正在调用 listServices 方法,它按预期工作,而我从 listService 调用的 getPortNumber 不起作用。我在 getPortNumber 方法中添加了错误点。我得到了 domainValue 的值,但我无法在 $(document).ready(function() 之后进行调试。控件直接返回 portNumber,在最终的 URL 中,我得到的端口号值未定义。我检查并验证了 port_url (json 文件)。我的 json 文件看起来像这样

{
"servers": [
    {
        "listeningPort": "6080",
        "shutdownPort": "8180",
        "redirectPort": "8443",
        "sslPort": "8443",
        "openWirePort": "61610",
        "jmxPort": "9332",
        "category": "Test A"
    }
}

我被击中了。我希望这个问题不是因为从另一个方法调用 javascript 方法。

function getPortNumber()
{
  var portNumber;
       var domainValue = $("#domain").val();

    $(document).ready(function() {

        $.getJSON(port_url, function(result) {
            $.each(result, function() {
                $.each(this, function(k, v) {
                    if (v.category == domainValue) {
                        portNumber = v.listeningPort;
                        return false;
                    }
                });
            });
        });
    });
    return portNumber;
}


function listServices()
{
    $(document).ready(function() {
            $("#list").text("");
            var jList = $("#list");
            var listOfServers = $("#servers").text();
            var serverArray = listOfServers.split(",");
            for (var i = 0; i < serverArray.length; i++)
            {
                var port = getPortNumber();
                var tempURL = "http://"+serverArray[i].trim().toLowerCase()+".javaworkspace.com:"+port+"/services/listServices";
                jList.append("<li><a href="+tempURL+" target='_blank'>"+tempURL+"</a></li>");
            }
    });
}
4

4 回答 4

2

您不需要document.ready在函数内部调用.....因为(我敢打赌)该函数是在文档准备好后调用的......

删除那个

function getPortNumber()
{
   var portNumber;
   var domainValue = $("#domain").val();



    $.getJSON(port_url, function(result) {
        $.each(result, function() {
            $.each(this, function(k, v) {
                if (v.category == domainValue) {
                    portNumber = v.listeningPort;
                    return false;
                }
            });
        });
    });

 return portNumber;
}

并对另一个做同样的事情..

于 2013-03-20T06:06:17.180 回答
1

听起来您需要学习在 javascript 调试器中单步执行回调函数的艺术。它并不像您想要的那样简单。即使回调函数看起来像逻辑的下一行执行,它也不会进入回调函数。从技术上讲,它不是。当您说要跳过一行代码时,它会跳过该行代码所做的所有事情,包括它调用的任何回调函数。

当您越过$(document).ready(function()并且文档尚未准备好时,它不会执行回调函数并且调试器不会进入该函数。因此,如果您想查看实际执行该回调函数时会发生什么,您必须手动在该回调函数中放置一个断点。你不能一行一行地走进它。

$.getJSON(port_url, function(result) {你的电话和你的电话也是如此$.each()。当你说越过该$.each()函数时,它实际上是越过该函数并进入该函数之后的下一行。这会跳过整个回调。如果您想单步执行$.each(),您必须在回调中手动设置断点,或者您必须单步$.each()执行 jQuery 并观察它最终调用您的回调。

所以在这段代码中:

function getPortNumber()
{
  var portNumber;
       var domainValue = $("#domain").val();

    $(document).ready(function() {

        $.getJSON(port_url, function(result) {
            $.each(result, function() {
                $.each(this, function(k, v) {
                    if (v.category == domainValue) {
                        portNumber = v.listeningPort;
                        return false;
                    }
                });
            });
        });
    });
    return portNumber;
}

如果您想查看内部$.each()循环中发生了什么,您必须在这一行设置一个断点if (v.category == domainValue) {并让代码运行直到它到达该断点。在调试器中单步执行 getPortNumber() 将在您使用回调函数的四个地方遇到问题:$(document).ready()$.getJSON()和。因此,要进入其中,您需要在其中设置一个断点并让代码运行直到它到达该断点。$.each()$.each()

于 2013-03-20T06:26:37.417 回答
0

从 getPortNumber 中删除 $(document).ready(function() 后,$.getJSON(port_url, function(result) { 之后的调试跳过代码。Firebug 没有报告任何错误。

于 2013-03-20T16:45:30.433 回答
0

如果那里存在一些错误,那么它将跳过。

你为什么用$(document).ready(function()

于 2013-03-20T06:06:20.643 回答