3 回答

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
不要試圖使異步代碼同步。您將鎖定事件循環(huán)并受到嚴(yán)重的性能損失。
并行發(fā)出請(qǐng)求。將承諾收集在一個(gè)數(shù)組中。用于Promise.all確定它們何時(shí)全部完成。
然后你可以從它們中提取數(shù)據(jù)并用它做你想做的事。
例如:
const baseUrl = "https://jsonplaceholder.typicode.com/users/";
const userIds = [1,2,3,4,5];
const completeUrls = userIds.map( id => `${baseUrl}${id}` );
const promises = completeUrls.map( url => jQuery.ajax({url}) );
const collectedDataPromise = Promise.all(promises);
collectedDataPromise.then( data => {
const names = data.map( user => user.name );
const ul = $("<ul />");
names.forEach( name => {
ul.append( $("<li>").text(name) );
});
$("body").append(ul);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
最后,我得到了我自己的解決方案,我使用 async/await 來(lái)理解。
async function ajaxGetData(){
return $.ajax({
url: '',
data: ''
}).then(response => response.data);
}
async function hanldeResponse(){
var arr = [1,2,...];
for(var i = 0; i < arr.length; i++){
let res = await ajaxGetData();
//some code to handle the response with res variable
}
}

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊
如果你必須在每次迭代中更新數(shù)據(jù),你可以使用一些字符串并在 .done() 中更新。
像這樣遞歸試試:
var counter = arr.length;
function callAjax() {
if (counter) {
$.ajax({
url: '',
data: ''
})
.done(function(xml) {
//get xml string to handle and put it into some table as contents
counter--;
callAjax();
});
}
}
- 3 回答
- 0 關(guān)注
- 161 瀏覽
添加回答
舉報(bào)