我猜你在「其他處理」訪問oEntry
或i
。
問題是,帶有附加處理的內部成功函數捕獲在外部定義的局部變量,如i
和oEntry
在閉包中。變量值不會被複制。
- for循環增量
i
,改變oEntry
並執行oModel.create()
方法。
- 下一個循環:for循環再次增加
i
,更改oEntry
並再次執行oModel.create()
。
- 當完成循環或任何時候在後端請求完成後,您的內部成功處理程序將被調用。他們訪問只存活了很長時間的外部變量,因爲它們在關閉中被捕獲。而且他們將處於for循環結束時的狀態。
所以,如果您不介意額外的處理可能發生不按順序,您可以將for循環內的代碼移動到單獨的函數中。當你調用從for循環的變量值將被複制的功能,使每個之前提到的關閉將捕捉其不會被用於循環改變的副本:
createSurvey: function(oEntry){
var that = this;
oModel.create("/SurveySet", oEntry, {
success: function(oData) {
for (var i = 0; i < questionData.questions.length; i++) {
that.createQuestion(oModel, questionData.questions, i, oData);
}
}
}
}
createQuestion(oModel, questions, i, survey){
var oEntry = {};
oEntry.SurveyId = survey.SurveyId;
oModel.create("/QuestionSet", oEntry, {
changeSetId: i.toString(),
success: function(oData) {
//Additional Processing
}
}
}
PS:您還可以使用questionData.questions.forEach(function(question, i){ ... });
來得到相同的效果。這次匿名函數複製這些值。
如果你需要保持嚴格的順序爲您額外的處理和sequencially發送請求到後端,我的確會建議使用承諾:你說的這個意思
createSurvey: function(oEntry){
var that = this;
oModel.create("/SurveySet", oEntry, {
success: function(oData) {
var promise = Promise.resolve();
questionData.questions.forEach(function(question, i) { //copy local variables
//Chain the promises
promise = promise.then(function(){ return that.createQuestion(oModel, question, i, oData)});
});
promise.then(function(){
//All done
})
.catch(function(){
//Error somewhere. remaining not executed
})
}
}
}
createQuestion(oModel, question, i, survey){ //returns a Promise now
var oEntry = {};
oEntry.SurveyId = survey.SurveyId;
return new Promise(function(resolve,reject){ //Wrap the UI5 stuff into a Promise
oModel.create("/QuestionSet", oEntry, {
changeSetId: i.toString(),
success: function(oData) {
//Additional Processing
resolve(oData);
},
error: reject
}
});
}
:「例如,如果for循環具有0和1,則只執行最後一個元素1。「 ?什麼是確切的問題,你能否詳細說明一下? –