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

Javascript 返回的数组未定义,不是异步的,javascript,jquery,ajax,Javascript,Jquery,Ajax,由于某种原因,我的函数返回未定义,但似乎在自己工作 function getDomains() { $.ajax({ url: '/rewrites/cgi-bin/ajax.pl?action=listdomains', dataType:'json', async: false, success: function( data ) { if (data.error) {

由于某种原因,我的函数返回未定义,但似乎在自己工作

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());

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

您正处于成功调用的功能中。这就是为什么您不能从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());

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

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

即使它是同步的,您仍然无法从回调返回。您的
return
语句用于
成功
回调-您不会从
getDomains
返回任何内容。你可以把
var域位于函数顶部。然后,在回调中,使用
domains=data.domains
,然后放入
返回域在您的function@Alnitak如何拼写:SJAX?请阅读以下内容了解更多信息:@nene很棒的帖子,OP应该读一下!你知道你会两次提醒结果吗?我只是拿了他的代码,告诉他如何分配结果并从他的函数返回域。问题中没有关于删除多个警报的内容。我留下来是为了确认getDomains()函数实际上返回了一个数组,并且没有像他之前所说的那样未定义。我对警报进行了两次编码,以便比较函数中不同点的数据。这样,就不需要设置async False。这是一个早期发生的函数,是任何其他功能的拦截器。这是唯一一个非异步的缺点。@user2245703 Ha,好吧,阻塞UI是预期的行为,使其更具意义啊,我真的很讨厌sync$。ajax调用,但至少这样更干净:(
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);
}