我试图在1秒后调用一个函数,但是该函数在foreach内部的ajax中调用。
代码:
spark_udf = udf(get_profile,StringType())
spark_df = spark_df.withColumn('get_profile', spark_udf())
print(spark_df.toPandas())
但只能在第一次和最后一次通话。
我已经尝试过将此函数放在异步函数中,并使用promise来解决,但仍然无法正常工作。 这是我尝试过的其他代码:
let index = 1;
portais.forEach(portal => {
setTimeout(() => {
$.ajax({
type: "POST",
url: url,
async: false,
success: function (data) {
index++;
text(index, total); // I want to call this function, after 1 second
}
});
}, 1000);
});
let index = 1;
const delay = (amount = number) => {
return new Promise((resolve) => {
setTimeout(resolve, amount);
});
}
async function forPortais(){
for(index; index<=total; index++){
$.ajax({
type: "POST",
url: `/exportacao/${portais[index].arquivo}.php`,
async: false,
success: async function (data) {
if(index>total){
text(index, total);
await delay(1000);
}
});
}
}
forPortais();
?预期结果是该函数被调用7次,超时为1秒。
答案 0 :(得分:0)
我可以解决这个问题,从而创建一个异步foreach以及一个异步延迟。
代码:
const waitFor = (ms) => new Promise(r => setTimeout(r, ms))
const asyncForEach = async function(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array)
}
}
const start = async () => {
await asyncForEach(portais, async (portal) => {
await waitFor(100);
text(index, total);
index++;
$.ajax({
type: "POST",
url: url,
async: false,
});
})
}
start();
答案 1 :(得分:-1)
使用此功能,您可以执行所需的操作,但是对于您的浏览器而言,费用非常昂贵
function sleep(milliseconds) {
var start = new Date().getTime();
while(true){
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
let index = 1;
portais.forEach(portal => {
$.ajax({
type: "POST",
url: url,
async: false,
success: function (data) {
index++;
sleep(1000);
text(index, total);
}
});
});