返回的数组是未定义的,不是异步的

时间:2013-05-30 14:30:02

标签: javascript jquery ajax

出于某种原因,我的函数返回undefined,而看似自己工作。

function getDomains() {
    $.ajax({
        url:    '/rewrites/cgi-bin/ajax.pl?action=listdomains',
        dataType:'json',
        async:  false,
        success: function( data ) {
            if (data.error) {
                alert(data.error);
            }
            else {
                alert(data.domains);
                return(data.domains);
            }
       }
   });
}

alert(getDomains());

我的第一个警报显示已填充的列表,但第二个警报未定义。这有什么意义吗?

2 个答案:

答案 0 :(得分:2)

您正处于成功通话的功能中。这就是为什么你没有从getDomains函数中获得结果的原因。将其分配给变量并在ajax调用后返回变量。

function getDomains() {
    var results;
    $.ajax({
        url:    '/rewrites/cgi-bin/ajax.pl?action=listdomains',
        dataType:'json',
        async:  false,
        success: function( data ) {
            if (data.error) {
                alert(data.error);
            }
            else {
                alert(data.domains);
                results = data.domains;
            }
       }
   });
   return results;
}

alert(getDomains());

答案 1 :(得分:1)

为什么不这样做,假设您需要返回一个名为whateverFunc()的函数:

function getDomains() {
    $.ajax({
        url:    '/rewrites/cgi-bin/ajax.pl?action=listdomains',
        dataType:'json',
        async:  false,
        success: function( data ) {
            if (data.error) {
                alert(data.error);
            }
            else {
                whateverFunc(data.domains);
            }
       }
   });
}


function whateverFunc(domains){
    alert(domains);
}

你无法从success回调中返回任何内容,这没有任何意义。 我还想在这里抱怨async:false。为什么你绝对需要它? 您应该让调用是异步的,并使用一些互斥锁或其他东西自己管理阻塞状态。实际上,在whateverFunc()中得到答案后,您应该触发弹出窗口或任何您需要做的事情。 它很干净,你可以控制阻塞状态。