Javascript 如何使ajax同步而不是使用async:false?

Javascript 如何使ajax同步而不是使用async:false?,javascript,jquery,ajax,asynchronous,Javascript,Jquery,Ajax,Asynchronous,我在ajax异步方面遇到了一些问题。我有一个数组,然后在数组中循环以进行ajax调用,如果成功,ajax将返回一个xml字符串,我将使用它填充一个表并更新进程栏。我使用async:false它在Firefox上运行良好,但在Chrome上运行不正常。我还尝试使用$.ajax().done(),但根本没有效果 当ajax调用完成后,是否仍然可以获得响应的xml字符串,然后运行下一个循环 for (var i = 0; i <= arr.length; i++){ $.ajax({

我在ajax异步方面遇到了一些问题。我有一个数组,然后在数组中循环以进行ajax调用,如果成功,ajax将返回一个xml字符串,我将使用它填充一个表并更新进程栏。我使用
async:false
它在Firefox上运行良好,但在Chrome上运行不正常。我还尝试使用
$.ajax().done()
,但根本没有效果

当ajax调用完成后,是否仍然可以获得响应的xml字符串,然后运行下一个循环

for (var i = 0; i <= arr.length; i++){
    $.ajax({
        url: '',
        data: '',
        async: false
    }).done(function(xml) {
       //get xml string to handle and put it into some table as contents
    });
    //Then go to next loop
}

for(var i=0;i不要尝试使异步代码同步。您将锁定事件循环并得到严重的性能损失

并行请求。收集数组中的承诺。使用
Promise.all
确定它们何时全部完成

然后,您可以从中提取数据,并对其进行处理

例如:

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(承诺);
collectedDataPromise.then(数据=>{
const names=data.map(user=>user.name);
常量ul=$(“
    ”); name.forEach(name=>{ ul.追加($(“
  • ”)文本(名称)); }); $(“正文”)。附加(ul); });

不要尝试使异步代码同步。您将锁定事件循环,并得到严重的性能损失

并行请求。收集数组中的承诺。使用
Promise.all
确定它们何时全部完成

然后,您可以从中提取数据,并对其进行处理

例如:

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(承诺);
collectedDataPromise.then(数据=>{
const names=data.map(user=>user.name);
常量ul=$(“
    ”); name.forEach(name=>{ ul.追加($(“
  • ”)文本(名称)); }); $(“正文”)。附加(ul); });

如果必须在每次迭代中更新数据,可以使用一些字符串并在.done()中更新

使用如下递归进行尝试:

var计数器=arr.length;
函数callAjax(){
如果(计数器){
$.ajax({
url:“”,
数据:“”
})
.done(函数(xml){
//获取要处理的xml字符串,并将其作为内容放入某些表中
计数器--;
callAjax();
});
}

}
如果必须在每次迭代中更新数据,可以使用一些字符串并在.done()中更新

使用如下递归进行尝试:

var计数器=arr.length;
函数callAjax(){
如果(计数器){
$.ajax({
url:“”,
数据:“”
})
.done(函数(xml){
//获取要处理的xml字符串,并将其作为内容放入某些表中
计数器--;
callAjax();
});
}

}
最后,我得到了自己的解决方案,我使用async/await来解释

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
   }
}
异步函数ajaxGetData(){ 返回$.ajax({ url:“”, 数据:“” }).然后(response=>response.data); } 异步函数hanldeResponse(){ var-arr=[1,2,…]; 对于(变量i=0;i
最后,我得到了自己的解决方案,我使用async/await来解释

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
   }
}
异步函数ajaxGetData(){ 返回$.ajax({ url:“”, 数据:“” }).然后(response=>response.data); } 异步函数hanldeResponse(){ var-arr=[1,2,…]; 对于(变量i=0;i
Really Synchronous AJAX被弃用,这是有充分理由的。任何东西都不应该阻止UI线程。读入
async
/
await
await
调用。请注意,使用
await
显然是次优的:请求2对请求1没有依赖性,因此以串行方式而不是并行方式运行它们将会很慢。我已经尝试过使用async/await,这对解决我的问题非常有帮助。非常感谢@CherrydTruly synchonous AJAX被弃用,这是有充分理由的。任何东西都不应该阻止UI线程。请阅读
async
/
await
await
调用。请注意。使用
await
这里是distinctly次优:请求2对请求1没有依赖性,因此串行而不是并行运行它们会很慢。我尝试过使用async/await,这对解决我的问题非常有帮助。非常感谢@Cherrydt这个问题明确希望避免
async:false
@Quentin很抱歉,我粘贴了ajax调用,因为它是正如问题中所述。我更新的代码应该是异步工作的。问题明确希望避免
async:false
@Quentin对不起,我粘贴了问题中的ajax调用。我更新的代码应该是异步工作的。要发布的数据不仅包含作为示例的id,还包含类似于GET as para的字符串ms@StevenDang-正如您所说,这只是一个示例。请求的具体内容并不相关。因此,如果我尝试这种方式,我就不必再使用
for
,对吗?正确。这使用
map
执行迭代(并将结果放入数组中).最后,我决定使用async/await来解决问题,正如我上面回答的那样:要发布的数据不仅包含您示例中的id,还包含一个GET as字符串params@StevenDang-正如你所说,这只是一个例子。spe