Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ajax异步调用-如何克服这个问题?_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript Ajax异步调用-如何克服这个问题?

Javascript Ajax异步调用-如何克服这个问题?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我是JS新手-我只想从这个开始 看看这个简单的例子,我想画X个仪表,其中X是通过Ajax调用从JSON中获取的 <body> <div id="gServer"></div><BR> <script type="text/javascript" language="javascript"> /* * Obtain number of sessions and Server Status * Number of sessions i

我是JS新手-我只想从这个开始

看看这个简单的例子,我想画X个仪表,其中X是通过Ajax调用从JSON中获取的

<body>
<div id="gServer"></div><BR>

<script type="text/javascript" language="javascript">
/*
 * Obtain number of sessions and Server Status
 * Number of sessions is used to draw gauge per session
 */
$.ajax({
   url: url,
   dataType: 'json',
   data: jd,
   success: function(data)
   {

       //
       Server_CpuCount = data.Server_Cpu_Count;
       Server_LoadAverage = data.Server_Load_Average;
       Server_Sessions = data.Server_Sessions_Count;

       // Create Gauge for every session connected
       for (i = 0; i < Server_Sessions; i++)
       {
        arr.push(new JustGage({
                         id: "g"+i,
                         value: parseFloat(data[i].Session_Load_Average).toFixed(2),
                         min: 0,
                         max: data[i].Session_Cpu_Count,
                         title: data[i].Session_Name,
                         label: "load"
                         }));
       }

       // Create main Server Gauge
       gServer = new JustGage({
                          id: "gServer",
                          // truncate to 2 digits
                          value: parseFloat(Server_LoadAverage).toFixed(2),
                          min: 0,
                          max: Server_CpuCount,
                          title: "GridMan Server",
                          label: "load average"
                          });
   }
   });

// Write out label
document.write(Server_Sessions + "<p>sessions</p><BR>");

// Render All Sessions Gauges
// !! It does not work, ajax is async and Server_Sessions is 0
for (i = 0; i < Server_Sessions; i++)
{
    document.write("<div id=\"g"+i+"\"></div>");
}
</script>
</body>


/* *获取会话数和服务器状态 *会话数用于绘制每个会话的量规 */ $.ajax({ url:url, 数据类型:“json”, 资料来源:jd, 成功:功能(数据) { // Server\u CpuCount=data.Server\u Cpu\u Count; Server\u LoadAverage=data.Server\u Load\u Average; 服务器会话=data.Server会话计数; //为每个连接的会话创建仪表 对于(i=0;i
”; //渲染所有会话 // !! 它不工作,ajax是异步的,服务器会话是0 对于(i=0;i
这部分不起作用,因为AJAX是异步生成的,因此服务器会话始终为0

 for (i = 0; i < Server_Sessions; i++)
    {
        document.write("<div id=\"g"+i+"\"></div>");
    }
for(i=0;i

如果此变量始终为0,如何绘制会话的量表?

最初显示0个会话的量表,并在ajax调用的成功回调函数中使用正确的数字进行更新。这就是你知道你得到数据的地方。如果您不希望用户看到0个仪表,则将其隐藏,直到成功回调并再次显示。

通过在ajax调用中使用回调函数修复了此问题

$.ajax({
       url: url,
       dataType: 'json',
       data: jd,
       success: function(data)
       {

       //
       Server_CpuCount = data.Server_Cpu_Count;
       Server_LoadAverage = data.Server_Load_Average;
       Server_Sessions = data.Server_Sessions_Count;
       // Create main Server Gauge
       gServer = new JustGage({
                              id: "gServer",
                              // truncate to 2 digits
                              value: parseFloat(Server_LoadAverage).toFixed(2),
                              min: 0,
                              max: Server_CpuCount,
                              title: "GridMan Server",
                              label: "load average"
                              });

       // Create Gauge for every session connected
       for (i = 0; i < Server_Sessions; i++)
       {

        // **Add Gauge on to the web page**
        $("body").append("<div id=\"g"+i+"\"></div>");

        arr.push(new JustGage({
                             id: "g"+i,
                             value: parseFloat(data[i].Session_Load_Average).toFixed(2),
                             min: 0,
                             max: data[i].Session_Cpu_Count,
                             title: data[i].Session_Name,
                             label: "load"
                             }));
       }
       }
       });
$.ajax({
url:url,
数据类型:“json”,
资料来源:jd,
成功:功能(数据)
{
//
Server\u CpuCount=data.Server\u Cpu\u Count;
Server\u LoadAverage=data.Server\u Load\u Average;
服务器会话=data.Server会话计数;
//创建主服务器仪表
gServer=new-JustGage({
id:“gServer”,
//截断为2位
值:parseFloat(服务器\加载平均值).toFixed(2),
分:0,,
max:Server\u CpuCount,
标题:“GridMan服务器”,
标签:“平均负荷”
});
//为每个连接的会话创建仪表
对于(i=0;i
这就是您有一个
回调的原因。使用它。哦,而且,它在回调中无论如何都不会起作用。你说的“更新它们”可能是重复的。如果我没有显示仪表(意味着我不包括),java脚本将弹出一个警报,说明g0、g1、g2(仪表)未定义。可能会创建一个空容器div并给它一个id。将渲染代码移动到一个函数,使其不会在页面加载时运行,而不是在document上运行。使用document.getElementById(“包装器”)。innerHTML=。。。或类似的。在您的成功回调中调用它来呈现gauges.Dis类似的内容,但将$(“body”).append(“”);在ajax回调函数中,这至少很有效。