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