searchForImportFolder
не возвращает обещание, поэтому цепочка не ждет, пока это обещание завершится.Сделайте то же самое в searchForImportFolder
, что вы сделали в checkFolderExistence
: оберните API в стиле обратного вызова в обещание.
Пара замечаний:
checkFolderExistence
должен вызвать reject
на пути ошибки;в настоящее время это не так. - Узел предоставляет функцию
promisify
, которую можно использовать для оборачивания вызовов API в стиле обратного вызова в обещаниях, а не делать это вручную.Или вы можете использовать promisify-fs
npm
модуль или promisify
npm
модуль , который позволяет вам обещать весь API одновременно, или собственный Node экспериментальный API обещаний для fs
. - Возможно, вы захотите сделать
checkFolderContent
асинхронным (снова используя обещания) вместо использования readdirSync
, который удерживает основной поток, ожидающий ввода-вывода. - Если вы используете любую последнюю версию Node, вы можете переключиться на использование
async
функций и ключевого слова await
, поскольку это позволяет вам писать свой логический поток, а не писать кучу обратных вызовов. searchForImportFolder
должен вернуть свой результат, а не устанавливать глобальный.
Так, например, здесь checkFolderExistence
и searchForImportFolder
с использованием util.promisify
(предполагается, что searchForImportFolder
должно вернуть его результат, поэтому вам придется корректировать код, используя его):
const { promisify } = require("util");
const readdirPromise = promisify(fs.readdir);
function checkFolderExistence(path) {
console.info('--- Checking the folder "' + path + '" existence... ---');
return readdirPromise(path)
.then(path => {
console.info("--- The folder \"C:\\For_testing\" exists... ---");
return path;
})
.catch(error => {
console.error('*** ERROR **** The folder "C:\\For_testing" doesn\'t exist. Testing is stopped!!! ***');
});
}
// ...
function searchForImportFolder() {
console.info('--- Searching for ".../Import" folder... ---');
return readdirPromise(destFolderPath64)
.then(() => {
console.info('--- The folder "C:/Program Files (x86)/StoreLine/Office/Import" was successfully found... ---');
return destFolderPath64;
})
.catch(() => readdirPromise(destFolderPath32))
.then(() => {
console.info('--- The folder ".../Import" was successfully found... ---');
return destFolderPath32;
})
.catch(error => {
console.error('*** ERROR *** The folder ".../Import" was not found ***');
throw error;
});
}
Если вам не нужна вся эта регистрация,checkFolderExistence
просто становится readdirPromise
, а searchForImportFolder
становится:
Или, если вам не нужна вся эта регистрация (предположительно, это былоr отладка):
const { promisify } = require("util");
const readdirPromise = promisify(fs.readdir);
// ...
function searchForImportFolder() {
console.info('--- Searching for ".../Import" folder... ---');
return readdirPromise(destFolderPath64)
.then(() => {
return destFolderPath64;
})
.catch(() => readdirPromise(destFolderPath32));
}
И здесь они используют util.promisify
и async
/ await
:
Или используя util.promisify
и async
/ await
:
const { promisify } = require("util");
const readdirPromise = promisify(fs.readdir);
// ...
async function searchForImportFolder() {
try {
await readdirPromise(destFolderPath64);
return destFolderPath64;
} catch (error) {
await readdirPromise(destFolderPath32);
return destFolderPath32;
}
}
Если вы хотите избежать повторного поиска двух разных папок, простая тактика - просто запомнить обещание от searchForImportFolder
и затем использовать then
для него в любое время, когда вам понадобится это значение:
const importFolderPromise = searchForImportFolder();
... тогда, когда вам это нужно:
importFolderPromise.then(folder => {/*...*/});
... или в функции async
:
const folder = await importFolderPromise;
Поиск будеттолько один раз.