使用Jquery进行多个异步Ajax调用的循环内部。

4

我希望在循环中调用多个API(例如:$.each)。我可以使用async:false模式来实现,但这会使脚本延迟。如何以同步模式实现此操作?仅忽略async选项将使只有list中的最后一个元素被发送到API调用。

$.each(lists, function(index, value) {

            channel = lists[index].channel;
            list = lists[index].list;

            $.ajax({
                url : 'api.php?list=' + list + '&from=' + from + '&to=' + to,
                dataType : 'json',
                async : false,
                success : function(data) {
                    obj = data;

                    $.ajax({
                        url : 'api.php?list=' + list + '&from=' + from + '&to=' + to + '&action=sender',
                        dataType : 'json',
                        async : false,
                        success : function(data) {

                            obj['senders'] = data.msg;
                            CommonContainer.inlineClient.publish(channel, obj);

                        }
                    });

                }
            });

        });

1
http://stackoverflow.com/questions/13250746/process-chain-of-functions-without-ui-block/13252018#13252018 - slebetman
你的意思是只有最后一个被发送到API调用了吗?看看_.after可能会有帮助,你可以创建一个函数,在它被调用X次后运行。如果我正在进行5个AJAX调用并且希望在它们都成功时运行某些东西,我会使用它。- 如果你想要一个例子,请告诉我,我可以随便丢一个。 - Troy Cosentino
1
我不同意这个重复。这里的问题是声明错误,使闭包无法保护变量。 - Denys Séguret
1个回答

5
那是因为channellist是全局变量(或者在传递给$.each的函数的作用域之外声明),因此没有受到闭包的保护。

使用这个:

  var channel = lists[index].channel;
  var list = lists[index].list;

你也应该将obj声明为

  var obj = ...

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