.catch не устраняет ошибку и не разрывает цепочку - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь написать файл.Некоторые файлы будут записаны по неправильным путям.Для каждого файла мне нужно 1. войти в консоль, с которой начинается запись.2. Запишите файл 3А, если он закончил запись, войдите в консоль готово.3B, если это неверный путь, войдите в консоль, чтобы файл не удалось

Прямо сейчас, если он не удается, он записывает обе вещи в консоль.

Я пытался вложить .thens, я пытался просто перезвонить.

async function beginWrite(filename){
    console.log(`Creating file ${filename}`)
}

async function writeComplete(filename){
    console.log(`Finished creating file ${filename}`)
}

async function writeFile(path, filename){
    fs.writeFile(path + '/' + filename, 'this is a file', (error) => {
        if(error) {console.log(`File ${filename} failed to write`)}
    });
}

async function logAndWrite(path, filename){
    beginWrite(filename)
    .then( () => {
        writeFile(path, filename)
    }
    )
    .then(writeComplete(filename))
    .catch( (e) => {
        return console.log(`File ${filename} failed to write`)
    })
}

Я ожидаю

Запись файла 1 Файл 1 завершен Файл 2 записи Файл 22 не удалось записать файл 3 записать файл 3 завершено

1 Ответ

0 голосов
/ 26 мая 2019

Вы не можете просто посыпать async объявлениями своих функций и надеяться на магию.

async - это способ справиться с Обещаниями. Для этого требуется, чтобы вы await Promise находились внутри асинхронной функции, что, в свою очередь, требует, чтобы у вас была функция, которая возвращает Promise. Вы не делаете ничего из этого.

Сначала вам нужна функция, которая возвращает Обещание. Нативные асинхронные функции узла используют обратные вызовы и ничего не возвращают, поэтому, если вы хотите использовать нативный fs.writeFile() и вместо этого возвращать Promise, вам нужно создать функцию-обертку. Этот процесс называется «обещание», и когда он выполняется вручную, он выглядит следующим образом:

function writeFileAsync(file, data){
    return new Promise(resolve => {
        fs.writeFile(file, data, err => {
            if (err) throw err; else resolve();
        })
    });
}

У узла также есть утилита, которая делает одно и то же за один шаг для любой асинхронной функции в стиле узла (util.promisify(original)).

const writeFileAsync = util.promisify(fs.writeFile);

Теперь, когда есть что-то, что мы можем await, мы можем сделать функцию async, которая ожидает ее (обратите внимание, что вам абсолютно необходимо блок try / catch):

async function test() {
    try {
        let filename = 'some/file';
        console.log(`Creating file ${filename}`)
        await writeFileAsync(filename, 'this is a file');
        console.log(`Finished creating file ${filename}`)
    } catch (err) {
        console.log(`File ${filename} failed to write`);
        console.log(err);
    }
}

или мы можем использовать его с эквивалентной обычной .then() и .catch() семантикой Обещаний:

let filename = 'some/file';
console.log(`Creating file ${filename}`);
writeFileAsync(filename, 'this is a file')
    .then(() => {
        console.log(`Finished creating file ${filename}`
    })
    .catch((err) => {
        console.log(`File ${filename} failed to write`);
        console.log(err);
    });
...