Как исправить неожиданное «ожидание» внутри ошибки цикла - PullRequest
1 голос
/ 07 июня 2019

Эслинт выдает мне ошибку "Неожиданно await внутри цикла". Я понимаю проблему, но не могу найти способ исправить код.

Я прочитал документы eslint: https://eslint.org/docs/rules/no-await-in-loop Когда я оборачиваю свой цикл в /* eslint-disable no-await-in-loop */, это исправляет ошибку. Однако это неэффективно, потому что каждое обещание будет ждать завершения предыдущего.

Результаты моих обещаний не зависят друг от друга, поэтому они могут выполняться одновременно. Я прав? Я был бы рад, если бы кто-нибудь мог показать мне, как исправить мой текущий код и использовать Promises

const resizeImages = async imagePaths => {
    try{

        // With the line bellow everything works as expected. But without it I get error
        /* eslint-disable no-await-in-loop */

        const results = [];

        for (const imagePath of imagePaths){
            const thumbDest = path.parse(imagePath).dir + '/resized' + path.basename(imagePath);
            let tempFilePath = path.join(os.tmpdir(), path.basename(imagePath));
            console.log("Image resizing in progress: " + imagePath);

            // File is downloaded to the firebase functions environment 
            await rootBucket.file(imagePath).download({
                destination: tempFilePath
            })
            // Uploading resized image back to the folder in firebase storage 
            await spawn('convert', [tempFilePath, '-resize', '900x900', tempFilePath]);
            // Uploading resized image back to the folder in firebase storage 
            const uploadedFile = await rootBucket.upload(tempFilePath, {
                destination: thumbDest,
                metadata: metadata
            })
            console.log("Resized img successfully saved in: " + thumbDest);
            console.log("Resized img mediaLink " + uploadedFile[0].metadata.mediaLink);

            results.push(uploadedFile[0].metadata.mediaLink);                        
        }

        /* eslint-enable no-await-in-loop */

        return resizedImages = results;
    }
    catch (err){
        return console.log("Function resizeImages error: " + err);
    }
}

Это часть облачной функции Google Firebase, в которой я пытаюсь создать миниатюру, уменьшить размер загруженных изображений и удалить оригинальные.

1 Ответ

3 голосов
/ 07 июня 2019
   const results = await Promise.all(imagePaths.map(async imagePath => {
     //...
     return uploadedFile[0].metadata.mediaLink;
   }));

Обратите внимание, что это "не ошибка".Это предупреждение, которое должно помочь вам улучшить ваш код.Есть ситуации, в которых ожидание внутри цикла имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...