在ajax电话的厄运金字塔

时间:2015-03-19 09:17:06

标签: javascript ajax

我有一个javascript应用程序,我想在其中进行ajax调用,如果需要,还可以进行额外的ajax调用,具体取决于之前的ajax响应。我设法做了一个很好的厄运金字塔:

    function startParentArray(id) {
    getIssueDetail(id).success(function(data) {
    var source = $("#parenttemplate").html();
    var tpl = Handlebars.compile(source);
    if(data.issue.parent) {
        nextparent = data.issue.parent.id;
        getIssueDetail(nextparent).success(function(data1) {
            $("#parenttable").append(tpl(data1.issue));
            if(data1.issue.parent) {
                nextparent = data1.issue.parent.id;
                getIssueDetail(nextparent).success(function(data2) {
                    $("#parenttable").append(tpl(data2.issue));
                    if(data2.issue.parent) {
                        nextparent = data2.issue.parent.id;
                        getIssueDetail(nextparent).success(function(data3) {
                            $("#parenttable").append(tpl(data3.issue));
                            if(data3.issue.parent) {
                                nextparent = data3.issue.parent.id;
                                getIssueDetail(nextparent).success(function(data4) {
                                    $("#parenttable").append(tpl(data4.issue));
                                    if(data4.issue.parent){
                                        nextparent = data4.issue.parent.id;
                                        getIssueDetail(nextparent).success(function(data5) {
                                            $("#parenttable").append(tpl(data5.issue));
                                        });
                                    }
                                });
                            }
                        });
                    }
                });
            }
        });
    }
});

}

getIssueDetail返回ajax响应。还有其他更漂亮的方法吗,例如在while循环中?

3 个答案:

答案 0 :(得分:1)

承诺是你正在寻找的,我在考虑this one。但jQuery也有一个($.Deferred,即使它没有实现所谓的A+ promises

这来自kris kowal的q

  

在第一关,承诺可以减轻“厄运金字塔”:   代码向前行进的速度比行进速度快的情况   前进。

答案 1 :(得分:0)

您可以使用$.when()

$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) )
      .done(function( a1, a2 ) {
      // a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively
});

答案 2 :(得分:0)

我没有测试这段代码,但这可能有效我猜

function startParentArray(id) {
    var source = $("#parenttemplate").html();
    var tpl = Handlebars.compile(source);

    parseArray(tpl, id);
}

function parseArray(tpl, parent){
    getIssueDetail(parent).success(function(data) {
        $("#parenttable").append(tpl(data.issue));
        if(data.issue.parent) {
            parseArray(tpl, data.issue.parent.id);
        }
    });
}

当你在所有成功回调你的请求时做同样的事情,这可能是一个很好的做事方式。