我有一个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循环中?
答案 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);
}
});
}
当你在所有成功回调你的请求时做同样的事情,这可能是一个很好的做事方式。