代码之家  ›  专栏  ›  技术社区  ›  Sosh89

带有函数的jQuery异步请求

  •  -1
  • Sosh89  · 技术社区  · 11 年前
    function form(elem) {
        var dati = $(elem).serialize();
        var action = $(elem).attr("action");
        var result = "";
        $.post(action, dati, function (data) {
            result = jQuery.parseJSON(data);
            alert(result)
            return result;
        });
    }
    $(document).on("submit", "#new-search-field", function () {
        var data = form($(this));
        alert(data);
        if (......) {.....
        }
    });
    

    我需要从post请求中读取异步结果,但我无法读取,因为我在“返回结果”之前得到了警报(数据)

    我该怎么解决?

    3 回复  |  直到 11 年前
        1
  •  1
  •   Radko Dinev    11 年前

    这不是异步性的工作原理。

    你得到了 alert(data) 之前 return result; 因为 $.post 异步工作。这个 form 函数执行并返回,然后过一段时间 $.邮政 将具有可用的Ajax响应数据,并将调用提供的回调函数,将数据作为参数传递。

    要实现您想要的目标,您基本上有两个选项:

    • 您可以使用回调(异步操作完成后将调用回调)。
    • 使用承诺/延期。

    回调版本1 :

    function form(elem, callback) {
        ...
        $.post(..., function(data) {
            data = f(data); // transform data somehow if you have to
            callback(data);
        });
    }
    $(document).on(..., function() {
        form($(this), function(data) {
            // use data
        });
    });
    

    回调版本2 :

    function form(elem, callback) {
        ...
        $.post(..., callback);
    }
    $(document).on(..., function() {
        form($(this), function(data) {
            // use data
        });
    });
    

    Promises版本 :

    function form(elem) {
        ...
        return $.post(...);
    }
    $(document).on(..., function() {
        form($(this))
            .done(function(data) {
               // use data
            })
            .fail(function() {
               // error
            });
    });
    
        2
  •  0
  •   Jrd    11 年前

    你需要为你的post包含一个回调,因为你的代码现在是这样的,它调用post,然后继续执行下一个命令。我只需要在函数中添加一个额外的参数。类似于:

    function form(elem, callback) {
        var dati = $(elem).serialize();
        var action = $(elem).attr("action");
        var result = "";
        $.post(action, dati, function (data) {
            result = jQuery.parseJSON(data);
            callback(result);
        });
    }
    $(document).on("submit", "#new-search-field", function () {
        form($(this), function (data) { alert(data); });
        if (......) {.....
        }
    });
    

    希望这有帮助

        3
  •  0
  •   Daniel E.    11 年前

    这是因为你的文章是异步实现的。尝试使用回调函数访问post请求的结果