0

我正在使用 jQuery $.ajax 将元素即时添加到我的数据库中。

服务器端返回最近添加的元素的 ID,我想在我的 done 事件块中捕获它。

        if(!key) {
            $.ajax({
                url: "/tags/add",
                type: "GET",
                data: {tagName:value}
            }).done(function(data){
                key = data;
            });
        }

/tags/add 返回:

return new Response($tags[0]->getId(), 200, array('Content-Type' => 'text/html'));

其中 Response 是特定于框架的。

如果我转到 URL /tags/add?tagName=123

如果该标签不存在,它将尝试将该标签添加到数据库中。如果成功,它将返回其 id。

在上面的例子中,在返回63

但是 done 函数似乎没有捕捉到它63(或任何数字)

这就是问题所在。

假设标签dogs不存在:

1)/tags/add?tagName=dogs将添加dogs到数据库中,并将返回 ID64

2)如果我console.log(data)在 done 事件块内的第一行中执行,它将记录0(标签不存在时的默认 ID)

3)如果我尝试dogs再次向数据库添加标签,/tags/add?tagName=dogs将看到它dogs已经存在,并且只会返回它的 id ( 64)

4)然后console.log(data)再次启动,并记录64

知道为什么会这样吗?

4

1 回答 1

0

问题在于 ajax 的异步特性。

为了在块外正确捕获服务器响应,我需要做的done就是设置async为 false。

    if(!key) {
        $.ajax({
            async: false,
            url: "/tags/add",
            type: "GET",
            data: {tagName:value}
        }).done(function(data){
            key = data;
        });
    }
于 2013-06-05T14:43:36.827 回答