1

如何在异步而不是同步的函数中发出第二个 AJAX 请求? result是一个应该以“字符串开始”开头并以“字符串结尾”结尾的字符串,但在字符串的中间将是正在迭代的初始 AJAX 请求的结果。

Foo = {
    foo: function() {
        $(document).on("change", '.foo', function(e) {
            e.preventDefault();
            $.ajax({
                url: "foo.php",
                success: function(rows) {
                    $.each(rows, function() {
                        var result = 'start of string'; // START
                        $.ajax({
                            url: "bar",
                            async: false, // I DON'T want this
                            success: function(data) {
                                result += data; // MIDDLE
                            }
                        });
                        result += 'end of string'; // END
                    });
                }
            });
        });
    }
}

谢谢你。

4

4 回答 4

3

您可以利用 jquery 延迟对象。您可以在不同的函数中有两个不同的 ajax 调用,然后您可以使用 .done() 方法确保在两个 ajax 调用都完成后获得最终字符串。

在这里阅读更多:

于 2013-03-20T10:08:06.263 回答
3

在 jquery 中,链接一个接一个地执行的异步调用的方法是 using promise.then(),这promise.pipe()在以前的 jquery 版本中也被调用过。

Foo = {
    foo: function() {
        $(document).on("change", '.foo', function(e) {
            e.preventDefault();

            var param1 = {url: "foo.php"};
            var param1 = {url: "bar"};

            $.ajax(param1)
               .then(function(rows) {
                    var result = 'start of string'; //START
                    var fn = function(data) {
                       result += data;
                    }
                    var last, first;
                    $.each(rows, function() { // rows should be iterable
                        if (!last) { 
                           first = last = $.ajax(param2).done(fn)
                        } else {
                           last = last.then(function(res) {
                              return $.ajax(param2).done(fn);
                           });
                        }
                    });
                    last.done(fn).done(function() {
                       result += 'end of string'; // END
                    });
                    return first;
               });
        });
    }
}
于 2013-03-21T00:47:03.177 回答
2

最简单的方法确实是使用延迟对象,例如使用 jQuerywhendone延迟语句的 JavaScript 示例;

$.when(ajaxCallOne()).done(ajaxCallTwo(rows));

function ajaxCallOne() {
    return $.ajax({
                url : "foo.php",
                async: true
            });
}

function ajaxCallTwo(rows) {
    var result = 'start of string';
    $.each(rows, function() {
        $.ajax({
            url : "bar",
            async : true,
            success : function(data) {
                result += data; // MIDDLE
            }
        });
        result += 'end of string'; // END
    });

    return result;
}

我不是 JavaScript 或 jQuery 专家,但我认为你应该看看那些延迟对象。

于 2013-03-20T10:35:50.210 回答
2

我认为你应该看看javascript promise design pattern

让我向你解释一下:

这个promise是一种代理,代表了操作的未来结果。然后,您将在 Promise 上注册一个回调,一旦操作完成并且结果可用,该回调将由 Promise 执行。

使用 jQuery,您可以像这样定义 Promise:

var promise = $.getJSON('url');

然后使用你的 promise 变量,你可以定义当你的请求完成或失败时要做什么,甚至可以在它失败或成功的情况下执行一些功能。

promise.done(function(s) {alert('done successfully'); });
promise.fail(function(){ alert('get failed!'); });
promise.always(function(){ alert('this 'll executed anyway!'); });

有很多关于它的教程

jQuery 中的 Promise 和 Deferred 对象

jQuery:延迟对象

javascript 承诺

CommonJS 中的“承诺”抽象有什么好处?

于 2013-03-20T10:58:37.920 回答