在foreach中的Ajax中设置setTimeout

时间:2018-09-26 16:08:39

标签: javascript ajax

我试图在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);
});
  • 如何在1秒后调用此功能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秒。

2 个答案:

答案 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);
        }
    });
});