JavaScript等待while循环中的异步函数

时间:2018-04-14 23:54:29

标签: javascript asynchronous while-loop promise

我目前有5个功能;每个人使用setInterval等待加载元素,而不是点击元素可用时导致下一个网页。这些函数也发生在while循环内。这些函数一个接一个地发生并且while循环等待所有函数在再次循环之前完成是非常重要的。由于函数是异步的,因此在任何函数甚至可以加载之前,循环将运行x次。

我想要做的例子:

function one () {
    var checkForItem = setInterval(function () {
        if ($('#element').length) {
            $('#element').click();
            clearInterval(checkForItem);
        }
    }, 100);
}

想象一下这些函数中的5个(onetwothreefourfive),所有函数都使用相同的格式{{1}和以下setInterval循环:

while

在继续循环之前,我将如何确保所有功能一个接一个地发生?

注意:我尝试过使用promises,虽然由于函数是异步的,循环仍然在函数完成之前继续。

3 个答案:

答案 0 :(得分:3)

使用async / await语法和promises:

function delay(t) {
    return new Promise(resolve => setTimeout(resolve, t));
}
async function one() {
    while (!$('#element').length) {
        await delay(100);
    }
    $('#element').click();
}

async function main() {
    for (var x = 0; x < 10; x++) {
        await one();
        await two();
        await three();
        await four();
        await five();
    }
}

答案 1 :(得分:0)

定义数组中的选择器,并逐渐迭代数组中的数组,直到到达数组的末尾:

.mainloop()

但是如果你在元素被添加到DOM时尝试触发一个函数(例如点击一个元素的东西),那么在时使用触发的东西会好得多。发生添加,例如创建者函数中的回调,或MutationObserver

答案 2 :(得分:-1)

尝试使用async等待包裹承诺:

async function one (){
      await (new Promise(function(reolve, reject){
         var checkForItem = setInterval(function () {
           if ($('#element').length) {
              $('#element').click();
              clearInterval(checkForItem);
              resolve();
            }
         }, 100);
      }));
}

//And then in your while loop:
while (x < y){
    await one();
    await two();
    ...
    x++
}

note :您的while循环也必须包含在异步函数中。