在递归函数中使用JQuery.Deferred,异步请求中的同步执行...

标题不知道怎么起合适,其实需求很简单:

黑色背景的容器在页面打开时是隐藏的,点击提交后显示。

然后开始执行递归方法,每次ajax请求完成时,更新容器内容。

在全部执行完成后输出“执行完成”。

submit->download->down。中间download方法是起到封装的作用。

至于为什么不使用$.ajax【async=false】,因为async会造成UI阻塞,结果就是,直到方法完全执行结束才会更新UI,与我们的需求不符合。

睡觉去...具体实现详细童鞋自己看代码吧...

栗子代码:

 

<html>
<head>
    <title>JQ延迟执行</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <script type="text/javascript" src="/scripts/jquery-1.9.1.min.js"></script>
</head>
<body>
    <div class="info" style="color:#00ff90;background-color:#000;padding:3px 10px;display:none">执行准备中...</div>
    <input type="button" id="submit" value="提交">
</body>
</html>
<script type="text/javascript">
    $(function () {

        function download(odtd) {
            console.info("开始download方法..");
            console.info("开始设置容器显示..");
            $(".info").show();
            console.info("容器已显示..");
            console.info("开始执行down..");

            var dtd = $.Deferred();
            var promise = dtd.promise();
            down(0, dtd);
            promise.done(function () {
                console.error("[应该延时出现]执行完down..");
                console.error("[应该延时出现]执行完download方法..");
                odtd.resolve();//通知上层结束
            });
        }


        function down(index,dtd)
        {
            console.info("开始执行ajax:第[" + (index + 1) + "]个");
            if (index < 3) {
                $.ajax({
                    url: "/api/user/test"   //每次请求延时5s
                }).done(function (data) {
                    console.info("第[" + (index + 1) + "]个ajax完成。开始append");
                    var info = "<p>正在执行第[" + (index + 1) + "]个: " + data + "<p>";
                    $(info).appendTo($(".info"));
                    console.info("开始进入下一次的down()");
                    down(++index, dtd);
                });
            }
            else {
                $("<p>执行完成</p>").appendTo($(".info"));
                dtd.resolve();//通知上层结束
            }
        }

        $("#submit").click(function () {
            console.info("submit点击开始执行内部..");
            var odtd = $.Deferred();
            var promise = odtd.promise();
            download(odtd);
            promise.done(function () {
                console.error("[应该延时出现]submit内部执行完download之后..");
                console.error("[应该延时出现]我应该最后出现..");
            });

            console.error("[应该延时出现]错误的延时演示..");
        });


    });
</script>

 

posted @ 2015-05-15 00:10  MHalo  阅读(682)  评论(0编辑  收藏  举报