如何在JavaScript函数中返回JSON对象?

7
我有这个函数
function getTags(level){
    $.getJSON("php/get-tags.php", { "parent": level }, function(json) {
        return json;
    });
}

我正在调用这个函数,代码如下:
$(function(){
    var tags = getTags('0');  
});

问题在于,在函数getTags()中返回的json是这样的: {"tags":["数学","科学","艺术","工程","法律","设计"]} 但是在var tags = getTags('0')处捕获返回值时,它得到了一个undefined值。
我返回值的方式有问题吗?

5个回答

8

正如其他人已经正确描述的那样,ajax请求默认情况下是异步执行的。因此,您需要以适当的方式处理它。您可以做的是返回jXHR对象,该对象也由jQuery promise maker组成。这可能看起来像:

function getTags(level){
    return $.getJSON("php/get-tags.php", { "parent": level });
}

然后像处理其他内容一样进行处理

$(function(){
    getTags('0').done(function(json) {
        // do something with json
    });
});

2

getJSON 是异步的,调用它的函数会在 HTTP 响应返回并触发回调之前完成。

你不能从中返回结果。

使用回调函数对数据进行任何想要的操作。


2

您正在以同步方式调用异步函数。

当您调用getTags时,它会触发对您的PHP页面的调用。如果JavaScript被阻止,则您的页面将挂起,直到服务器响应JSON为止。您需要重新考虑逻辑并触发回调。

function getTags(level){
    $.getJSON("php/get-tags.php", { "parent": level }, function(json) {
        //do something with the JSON here.
    });
}

1

你无法从 AJAX 调用中返回。它是异步的。你需要在回调函数中处理所有与返回数据有关的逻辑。


1
如果你需要它按照那样的方式工作,你的getTags函数必须返回一个值。目前它没有返回任何值。你可以通过使用$.ajax并将async设置为false来实现这一点。

2
async: false 会导致整个浏览器在 AJAX 调用完成之前被锁定。 - gen_Eric
嗯,是的。如果这是原帖作者想要的话..? - bububaba
1
我的意思是这是一个坏事,因为用户可能会认为他们的浏览器已经崩溃了。 - gen_Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接