Обещания Javascript: Могу ли я узнать, какая часть цепочки обещаний вызвала ошибку? - PullRequest
0 голосов
/ 06 мая 2018

(прошу прощения за мой английский)

Сейчас я узнаю об обещаниях javascript. Ниже приведен пример простого кода javascript для node.js ( my node.js версия v10.0.0 ), которая асинхронно читает и анализирует файл JSON с использованием цепочки обещаний.

const fs = require("fs");

function readFileAsync(filename) {
    return new Promise((resolve, reject) => {
        fs.readFile(filename, 'utf8', (error, result) => {
            if (error)
                reject(error);
            else
                resolve(result);
        });
    });
}

readFileAsync('test.json')
    .then(res => JSON.parse(res))
    .then(res => { console.log('JSON=', res); })
    .catch(err => { console.log(err.message); });

Я обнаружил, что этот пример кода генерирует различные форматы сообщений об ошибках. Например, если он не может найти «test.json», сообщение об ошибке будет ...

ENOENT: no such file or directory, open '/home/node/test.json'

Если он не может проанализировать 'test.json', появляется сообщение об ошибке ...

Unexpected token / in JSON at position 31

Я хочу изменить пример кода для генерации того же формата сообщения об ошибке, всегда содержащего имя файла JSON.
Для этого, во-первых, я должен знать, какая часть цепочки обещаний вызвала ошибку. Как я могу знать?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Ниже пример кода является моим решением. Спасибо, Берги и Стивен.
Я выбрал это решение, потому что хочу точно знать, где произошла ошибка и что это за ошибка.

const fs = require("fs");

function readFileAsync(filename) {
    return new Promise((resolve, reject) => {
        fs.readFile(filename, 'utf8', (error, result) => {
            if (error)
                reject(error);
            else
                resolve(result);
        });
    });
}

function readJsonAsync(filename, fnCallBack) {
    function fnMessage(n, str) {
        console.log(`[${n}:${filename}]`, str);
    }
    readFileAsync(filename)
        .then(
            res => JSON.parse(res),
            err => { fnMessage(-1, err.message); }
        ).then(
            res => {
                // if some errors occured at the previous step, res === undefined
                if (res !== undefined)
                    fnCallBack(filename, res);
            },
            err => { fnMessage(-2, err.message); }
        );
}

function printJSON(filename, json) {
    console.log(`JSON[${filename}]:`, json);
}

readJsonAsync('test.json', printJSON);

У моего решения есть предпосылка. Обязательным условием является ...

Нет простого способа разорвать цепочку обещаний, даже если есть ошибки произошло на предыдущих этапах цепочки.

Правильно ли это предварительное условие?

0 голосов
/ 07 мая 2018

Есть два способа приехать, что вы хотите.

Promise.then имеет два аргумента, см. Ниже код и вы можете получить больше информации здесь

readFileAsync('test.json')
    .then(res => JSON.parse(res))
    .then(res => { console.log('JSON=', res); }, error => {
      // here can catch error of previous then function
    });

Другой способ - изменить функцию readFileAsync

function readFileAsync(filename) {
    return new Promise(resolve => {
        fs.readFile(filename, (error, result) => {
            if (error)
                resolve(null); // you can resolve whatever you want
            else
                resolve(result);
        });
    });
}

И .catch() не будет ловить ошибки readFileAsync.

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