Jquery 如何确保.then()中的函数在继续之前完成?
下面是$.when().then()的用法 setLineDet()的代码: setHeaderSet()的代码: 控制台输出:Jquery 如何确保.then()中的函数在继续之前完成?,jquery,ajax,promise,jquery-deferred,Jquery,Ajax,Promise,Jquery Deferred,下面是$.when().then()的用法 setLineDet()的代码: setHeaderSet()的代码: 控制台输出: line 1 line 4 line 2 line 3 done setting line details header 1 header 4 done setting header details done setting other details header 2 header 3 hasValue: 3, doneSetOpr: 0 set desc1 set
line 1
line 4
line 2
line 3
done setting line details
header 1
header 4
done setting header details
done setting other details
header 2
header 3
hasValue: 3, doneSetOpr: 0
set desc1
set desc2
set desc3
line 1
line 2
line 3
done setting line details
header 1
header 2
header 3
set desc1
set desc2
set desc3
done setting header details
done setting other details
//the "set desc1/2/3" is displayed from the setDesc() function
line 1
line 4
line 2
line 3
done setting line details
header 1
header 4
done setting header details
done setting other details
header 2
header 3
hasValue: 3, doneSetOpr: 0
set desc1
set desc2
set desc3
line 1
line 2
line 3
done setting line details
header 1
header 2
header 3
set desc1
set desc2
set desc3
done setting header details
done setting other details
//the "set desc1/2/3" is displayed from the setDesc() function
你需要阅读和学习承诺链。
.then()
处理程序中的异步操作需要自身返回一个承诺,然后在.then()
处理程序中返回该承诺。这将导致承诺链在前进到链中的下一个之前等待该承诺。然后()
。避免!感谢您对jfriend00和Bergi的回复。我一定会看看延迟的反模式。
line 1
line 4
line 2
line 3
done setting line details
header 1
header 4
done setting header details
done setting other details
header 2
header 3
hasValue: 3, doneSetOpr: 0
set desc1
set desc2
set desc3
$.when(setLineDet(rptId, rptLn)).then(function(data) {
console.log("done setting line details");
return setHeaderDet(rptId);
}).then(function(data) {
console.log("done setting header details");
return setOtherDet();
}).then(function(data) {
console.log("done setting other details");
});
function setLineDet(id, ln) {
console.log("line 1");
funcSel = "get_ln_det";
var passVar = funcSel+"~@"+id+"~@"+ln;
return ajaxCall(passVar).done(function(data) {
console.log("line 2");
var lnData = data.trim().split("~@");
// set line values
return lnData[0];
}).then(function(data) {
console.log("line 3");
return setRptLnList(data);
});
}
function setHeaderDet(id) {
console.log("header 1");
funcSel = "get_hdr_det";
var passVar = funcSel+"~@"+id;
var hdrDataCpy = ""
return ajaxCall(passVar).then(function(data) {
console.log("header 2");
var hdrData = data.trim().split("~@");
hdrDataCpy = hdrData;
//set header values
return hdrData;
}).then(function(data) {
console.log("header 3");
return $.when(setDesc("desc1", hdrDataCpy[6])).then(function(data) {
return setDesc("desc2", hdrDataCpy[7]);
}).then(function(data) {
return setDesc("desc3", hdrDataCpy[8]);
}).then(function(data) {
return setDesc("desc4", hdrDataCpy[9]);
}).then(function(data) {
return setDesc("desc5", hdrDataCpy[10]);
}).then(function(data) {
return setDesc("desc6", hdrDataCpy[11]);
});
});
}
line 1
line 2
line 3
done setting line details
header 1
header 2
header 3
set desc1
set desc2
set desc3
done setting header details
done setting other details
//the "set desc1/2/3" is displayed from the setDesc() function