js ajax请求直接跳过什么原因,$.ajax同步请求会阻塞js进程

背景

上周有同事问我关于ajax的问题(同事是测试,他自己写的js脚本),在一个循环中使用 jquery 的 $.ajax 方法获取数据后更新 dom,但出现的问题是更新 dom 会在循环请求完成后再渲染。

分析问题

这是同事发给我的代码(省略了部分数据)

document.getElementById('send').onclick = function() {

// ...

for (var group = 1; group <= groupsNums + 1; group++) {

// ...

$.ajax({

async: false,

url: '/invest',

type: 'POST',

// timeout: 6000,

contentType: 'application/x-www-form-urlencoded',

data: {

csrfmiddlewaretoken: token,

definedEnv: definedEnv,

env: env,

nums: nums,

phone: phone,

passwd: passwd,

prodcutList: prodcutList,

minAmount: minAmount,

maxAmount: maxAmount,

multiple: multiple,

group: group,

},

dataType: 'json',

success: function(result) {

// var data=JSON.parse(result);

console.log(result, '>>>', typeof result);

// console.log($('#results').html)

console.log('bbb:', result.code);

// $('#results').innerHTML = JSON.stringify(result)

let success_result_msg = result.succss_data.map(item => item.msg).join('
');

let fail_result_msg = result.fail_data.map(item => item.msg).join('
');

console.log(success_result_msg, '>>>', fail_result_msg);

document.getElementById('success_results').innerHTML += success_result_msg + '
';

document.getElementById('fail_results').innerHTML += fail_result_msg + '
';

},

});

}

};

我的第一感觉,是不是浏览器将两次 dom 操作合并渲染了,所以让他在 success 最后加上

const clientWidth = document.body.clientWidth

这样能够让浏览器及时渲染一次以获得正确的 clientWidth 属性,但还是不能解决问题

954d6705e744

image

解决问题

那应该就是 async: false 导致的问题了,为了保证渲染顺序不出错,我们可以改写成 async await 的方式,在保证异步加载同步控制的同时不会阻塞主进程

document.getElementById('send').onclick = async function() {

// ...

for (var group = 1; group <= groupsNums + 1; group++) {

// ...

const result = await $.ajax({

url: '/invest',

type: 'POST',

// timeout: 6000,

contentType: 'application/x-www-form-urlencoded',

data: {

csrfmiddlewaretoken: token,

definedEnv: definedEnv,

env: env,

nums: nums,

phone: phone,

passwd: passwd,

prodcutList: prodcutList,

minAmount: minAmount,

maxAmount: maxAmount,

multiple: multiple,

group: group,

},

dataType: 'json',

});

// var data=JSON.parse(result);

console.log(result, '>>>', typeof result);

// console.log($('#results').html)

console.log('bbb:', result.code);

// $('#results').innerHTML = JSON.stringify(result)

let success_result_msg = result.succss_data.map(item => item.msg).join('
');

let fail_result_msg = result.fail_data.map(item => item.msg).join('
');

console.log(success_result_msg, '>>>', fail_result_msg);

document.getElementById('success_results').innerHTML += success_result_msg + '
';

document.getElementById('fail_results').innerHTML += fail_result_msg + '
';

}

};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值