如何在间隔函数内正确地对jQuery post请求计时



我目前正在一个间隔函数中进行一些发布请求:

let getStatusIV = setInterval( () => {
let data = {
action: 'get_products_status',
import_id: importId
};
$.post( ajaxurl, data, function () {
} ).done( response => {
if (response.success && response.data) {
// showLoadingSpinner( '#wpcontent', response.data ); <- Sets the text at an overlay
}
} )
}, 500 );

这个interval/post函数从我的后端返回另一个AJAX调用的状态,例如:Processed 20 of 700 products

问题是,请求没有按照调用的顺序解决,因此我得到了这个例子:

Processed 20 of 700 products
Processed 19 of 700 products
Processed 30 of 700 products
Processed 80 of 700 products
Processed 75 of 700 products

有什么办法解决这个问题吗?我真的需要短的间隔时间,所以设置更长的间隔时间没有帮助。

异步编程就是这样工作的。既然你有这么多事情要处理,那么继续调用.then()就没有那么实际了。但为什么秩序如此重要?实际上,大多数操作都是异步处理的,以最大限度地提高效率。顺便说一句,我是个新手,但我确实遇到过这种情况,我只是让所有东西都异步来解决同样的问题。

------------------------------------

好吧,现在我找到了一种方法来实现这一点。这是DavidFlanagan的JavaScript:TheDefinitiveGuide中的一个例子。你可能想看看它,因为它确实太棒了。

function fetchSequentially(urls) {
const bodies = [];
//Response bodies are stored here
function fetchOne(url) {
return fetch(url)
.then((response) => response.text())
.then((body) => {
bodies.push(body);
});
}
let p = Promise.resolve(undefined);
//Fulfill an empty promise to initiate the promise chain
for (url of urls) {
p = p.then(() => fetchOne(url));
//Build the promise chain automatically
}
return p.then(() => bodies);
/*
Return bodies. It's a promise so you may call 
.then() one last time to get the output. 
For the progress bar, you may want to use event 
to track how many requests have been done.
*/
}

实际上,您可以使用event来处理进度条问题,以保留请求";平行";。只需发出一个事件来宣布一个请求已经完成。听一听活动,并跟踪完成了多少次而不是哪一次。然后进度条将永远不会倒退。

最新更新