Js 如何实现for循环中POST。
由于需要POST的数据太大,为了程序稳定,所有将数组拆分为1000条每组,循环POST到PHP。问题来了,每次循环理论上应该等PHP返回完成才再次发送。我一开始想到ajax同步,$.ajaxSettings.async = false,结果报错,提示async = false已弃用、不建议使用。
查了一下jq官网描述“同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。从jQuery 1.8开始,不建议在async: falsejqXHR($.Deferred)中使用;您必须使用成功/错误/完成回调选项,而不要使用jqXHR对象的相应方法jqXHR.done()。”
我用的是for循环,回调的说法不适应我的情况吧。
求大神指点。
for (var i = 0, len = vRow; i < len; i += 1000) {
var arrDaoRuDiZhi = JSON.stringify(vDaoRuDiZhi.slice(i, i + 1000)).replace(/\\r/g, "");
$.post(vPostPhpUrl, {
arrDaoRuDiZhi: arrDaoRuDiZhi
},
function (data, status) {
var arrFanHui = JSON.parse(data);
console.log("服务器端完成");
});
}; 帮顶一下 这个我还真没理解透 本帖最后由 少不更事 于 2019-10-3 09:24 编辑
很久没看jq了,也不太了解现在jq是怎样的。感觉你的问题可以看一下js 的fetch和Promise.all
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
https://developer.mozilla.org/zh-CN/docs/Web/API/WindowOrWorkerGlobalScope/fetch 用递归应该就可以了吧,封装成一个函数,把1000条数据弄成一个数组,参数为i+1 接口传递数组的i然后在接口成功返回的回调里再调用自身,当i>1000时,跳出 好像也没想到比较优雅的方式。。。
大概写几行代码 表示一下思路
改用while循环
var debounce = false; // 也就是设定一个标识,POST期间不重复发
var i = 1; // i就是第几组数据
while(true) {
if (debounce) { 延时几秒 continue; }
debounce = true;
//这里写POST请求代码,等success时,把debounce置false,i+1
//同时判断有没有超过最后一组数据了,超过就break
} 如果你不想递归,还可以写一个定时器来操作 定时器时间设定非常短然后设定一个全局变量为状态码,默认为false当接口成功返回时 改为true 定时器内就不停的去判断这个状态码,当状态码为true时,则i++并且调用发送请求并且把状态码改为false 方法很多,都可以实现 deasync?
https://github.com/abbr/deasync 本帖最后由 badyun 于 2019-10-3 10:47 编辑
用Promise啊,我把代码写给你
const request = async (arr) => {
return new Promise((resolve, reject) => {
$.post(vPostPhpUrl, {
arrDaoRuDiZhi: arr
},
(data, status) => {
resolve(JSON.parse(data))
});
})
};
(async () => {
for (var i = 0, len = vRow; i < len; i += 1000) {
var arrDaoRuDiZhi = JSON.stringify(vDaoRuDiZhi.slice(i, i + 1000)).replace(/\\r/g, "");
await request(arrDaoRuDiZhi)
};
console.log('全部完成')
})()
Promise正解 定时器是最简单的
页:
[1]
2