Как прервать цикл, когда либо время ожидания, либо условие заполнено?

#javascript #while-loop

Вопрос:

Я хочу создать цикл while, в котором он будет прерываться всякий раз, когда закончится время ожидания или будет выполнено условие

 async checkFile (filePath) {
    const readDir =  fs.readdirSync(filePath,'utf-8')
    while(true) {
        if(readDir === filename) {
            break;
        }
        
    } 
}
 

Комментарии:

1. Используйте Promise.any() с двумя обещаниями, одно из которых «условие выполнено», а другое «время истекло». Решение Promise.any() будет принято, когда любой из них будет выполнен.

2. Какой тайм-аут? Какое условие — оба true и readDir являются постоянными во время вашего цикла? Что такое filename ?

3. … почему асинхронный подход (тайм-аут операции, предлагаемое обещание) в любом случае, когда метод чтения предполагает иное … fs.readdirSync ? … как насчет… filenames = fs.readdirSync(filePath,'utf-8'); filenames.forEach(file => console.log(file)); (Я не являюсь node.js специалист по файловой системе)

4. в вашей первой строке отсутствует function ключевое слово после async . Если только это не метод из класса. Есть три способа выполнить вашу задачу, используя обещание, которое будет выполнено либо при обнаружении файла, либо при истечении времени ожидания. Если в вашем цикле есть неблокирующие действия, вы можете установить время ожидания для изменения условия while. Вы также можете проверить внутри своего цикла, чтобы узнать, прошло ли время с начала вашего цикла.

5. Возможно, ОП также рассмотрит возможность изучения документации файловой системы узла

Ответ №1:

Как насчет чего-нибудь в этом роде? Создание переменной даты начала, а затем выполнение условия для цикла, чтобы текущая дата — дата начала была меньше 1000 (мс) или любой другой тайм-аут, который вы бы предпочли

 async checkFile(filePath) {
    const readDir =  fs.readdirSync(filePath,'utf-8');
    const start = new Date();
    while ((new Date()) - start < 1000) {
        if(readDir === filename) {
            break;
        }

    }
}

 

Комментарии:

1. Я добавлю, что если вы используете подобный цикл для напряженного ожидания, он не идеален в js. Напряженное ожидание обходится дорого, требует больших ресурсов. Было бы лучше иметь обещание, которое будет выполнено, когда условие будет выполнено.