首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Do while javascript问题

Do while javascript问题
EN

Stack Overflow用户
提问于 2011-08-05 11:50:52
回答 3查看 3.5K关注 0票数 1

我尝试在do while循环中发送多个post,但没有添加结果

代码语言:javascript
复制
<script type="text/javascript">
function action() {
    var initval = 1;
    var endval = 5;
    do {
    var action_string = 'txtuser=someone';

    $.ajax({
                    type: "POST",
                    url: "http://localhost/js.php",
                    data: action_string,
                    success: function(result){
                       $('div#append_result').append(initval + ',<br/>');
                     }  
                });
    initval++;
     } while (initval <= endval);
  }
</script>

输出是: 5,5,5,5,5,

我需要输出是: 1,2,3,4,5,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-05 11:56:55

由于AJAX的异步特性,当您的成功函数对任何生成的AJAX请求运行时,循环已经完成,initval被设置为5。您需要在每个请求开始时捕获initval的状态,并在success()方法中使用该捕获的状态。关闭该值是最简单的方法:

代码语言:javascript
复制
function action() {
    var initval = 1;
    var endval = 5;
    do {
        var action_string = 'txtuser=someone';

        ( function( captured_initval ){
            $.ajax({
                type: "POST",
                url: "http://localhost/js.php",
                data: action_string,
                success: function(result){
                    $('div#append_result').append(captured_initval + ',<br/>');
                }  
            });
        }( initval ) );

        initval++;
    } while (initval <= endval);
}

但是要知道,一个或多个请求可能会在服务器上挂起,从而允许后一个请求首先完成,这可能会导致1, 2, 5, 3, 4或类似的结果。

而且,使用元素的ID比在散列选择器前面加上元素标记名要快得多。另外,您应该避免在每次成功运行时都重新查询DOM以获取结果DIV。抓取一次,在需要的时候使用:

代码语言:javascript
复制
function action() {
    var initval = 1;
    var endval = 5;
    do {
        var action_string = 'txtuser=someone',
            $AppendResult = $('#append_result');

        ( function( captured_initval ){
            $.ajax({
                type: "POST",
                url: "http://localhost/js.php",
                data: action_string,
                success: function(result){
                    $AppendResult.append(captured_initval + ',<br/>');
                }  
            });
        }( initval ) );

        initval++;
    } while (initval <= endval);
}
票数 6
EN

Stack Overflow用户

发布于 2011-08-05 11:58:03

Ajax请求是异步的,这意味着在成功处理程序返回时,循环已经完成。相反,您可以创建一个闭包来保留该值:

代码语言:javascript
复制
success: (function(i){
    return function() {
         $('div#append_result').append(i + ',<br/>');
    }
})(initval)
票数 3
EN

Stack Overflow用户

发布于 2011-08-05 12:00:56

这是因为ajax的异步行为:以下是修改后的版本:

代码语言:javascript
复制
var initval = 1;
var endval = 5;
function action(){
    var action_string = 'txtuser=someone';
    $.ajax({
        type: "POST",
        url: "http://localhost/js.php",
        data: action_string,
        success: function(result){
           $('div#append_result').append(initval + ',<br/>');
           initval++;
           if(initval<=endval)
            action();
        }  
    });
 }

现在,这在某种程度上是一种顺序方法。注意:我假设每个ajax请求都返回成功,如果有错误,您应该在错误回调中处理它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6951191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档