如何将responseText从异步AJAX调用传递给另一个函数?

时间:2011-07-16 18:36:26

标签: javascript jquery

我正在使用jQuery和countdown(jQuery插件)。我希望倒计时运行x秒,其中x是来自serverTime.php的整数。

问题 - 我无法弄清楚如何在函数getTime()中返回responseText,以便它可以在Timer函数中使用。

起初我尝试使用纯js(没有jQuery),我发现了类似的主题:

我遇到的一些想法/可能的解决方案:

  • 使用同步调用和全局变量来存储响应。一世 试过这个并不认为它是一个选项,因为它冻结了 用户屏幕(在大多数情况下也被视为不良做法)
  • helper function
  •   -

计时器功能

$(function (){
    var time = getTime(); // time is an integer
    $('#defaultCountdown').countdown({until: time, format: 'S', onExpiry: action});
});

getTime()检查serverTime.php并返回内容,该内容将是一个整数。 警报(html)工作,而返回HTML不起作用。我知道这是因为调用是异步的。

function getTime()
{
    $.ajax({
    url: "serverTime.php",
    cache: false,
    async: true,
    success: function(html)
    {
        alert(html);
            helperFunction(html);
        return html;
    }
    });
}

helperFunction 即可。不幸的是,我不知道如何将结果传递给计时器功能。

function helperFunction(response)
{
    return response;
}

serverTime.php

echo 30; // 30 seconds, just an example

我试图解释我的问题,并表明我已经花了一些时间。如果您需要其他信息,请询问。也许我只是在想错误的方向。

2 个答案:

答案 0 :(得分:4)

您的代码未显示实际使用time变量的位置。

最终,您无法从getTime()函数返回AJAX响应,因为AJAX是异步,因此getTime() 将始终在响应之前返回接收

您最好将所需的任何代码传递到getTime()函数...

function getTime( func )
{
    $.ajax({
        url: "serverTime.php",
        cache: false,
        async: true,
        success: func  // <--set the function received as the callback
    });
}

   // pass a function to getTime, to be used as the callback

function myFunc( html ) { 
   /* do something with html */ 
}
getTime( myFunc );

...或者从:success回调中调用另一个函数,将响应传递给它......

function getTime( func )
{
    $.ajax({
        url: "serverTime.php",
        cache: false,
        async: true,
        success: function( html ) {
            someFunction( html ); // <--- call a function, passing the response
        } 
    });
}

someFunction( html ) {
    /* do something with html */
}

...或者只是将正确的代码硬编码到:success回调中......

function getTime( func )
{
    $.ajax({
        url: "serverTime.php",
        cache: false,
        async: true,
        success: function( html ) {
            /* do something with html */
        } 
    });
}

修改

我现在看到你想要使用time的位置。你可以使用我上面的第二个例子。只需确保您创建的函数位于getTime()函数可访问的变量范围内。

像这样:

$(function (){
    getTime();  // get things started when the DOM is ready
});

function getTime() {
    $.ajax({
        url: "serverTime.php",
        cache: false,
        async: true,
        success: function(html)
        {
            doCountdown( html );  // call doCountdown, passing it the response
        }
    });
}

   // doCountdown receives the response, and uses it for the .countdown()
function doCountdown( time ) {
    $('#defaultCountdown').countdown({until: time, format: 'S', onExpiry: action});
}

答案 1 :(得分:1)

因为您正在异步运行ajax,所以它在一个单独的线程中运行。这意味着您设置var time = getTime();的位置没有设置。当ajax调用return html;运行时,没有什么可以等待接收响应。原始线程已经完成运行,并且由于函数getTime()未设置任何内容,time将为空。

您可以将时间设置为全局变量,然后调用getTime(),并设置ajax调用完成的时间 - 这一切都取决于您何时何地需要使用时间....

var time = 0;

$(function (){
    getTime()
    $('#defaultCountdown').countdown({until: austDay, format: 'S', onExpiry: action});
});

function getTime()
{
    $.ajax({
        url: "serverTime.php",
        cache: false,
        async: true,
        success: function(html)
        {
            time = html;
        }
    });
}