узел: добавить функцию catch, чтобы обещать после строительства - PullRequest
0 голосов
/ 07 декабря 2018

Рассмотрим этот код:

var p = new Promise(function(resolve, reject){
    console.log("run");
    setTimeout(reject, 5);
});

p.catch(function() {
    console.log("cought!");
});

p.then(function() {
    console.log("then!");
});

Вывод (браузер):

run
cought!

Здесь, в браузере, он ведет себя как ожидалось.Бун бежал как нод-скрипт, который я получаю:

run
cought!
(node:13927) UnhandledPromiseRejectionWarning: undefined
(node:13927) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:13927) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Таким образом, отказ был пойман, но узел все еще жалуется - почему это?

Я мог бы связать всевместе как предложено здесь и здесь :

new Promise(function(resolve, reject){
    console.log("run");
    setTimeout(reject, 5);
}).then(function() {
    console.log("then!");
}).catch(function() {
    console.log("cought!");
});

Вывод (браузер и узел):

run
cought!

В моем сценарии использования я не могу использовать это решение, потому что у меня есть заводская функция, котораястроит обещание.Функции catch и then должны быть прикреплены вызывающей стороной фабрики. В случае функции then она работает, но не для catch. Как мне избежать этого предупреждения?

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Я использую Async Await для решения этой проблемы, надеюсь, это поможет, отлично работает на моем компьютере.

const iReturnPromise = () => {
    return new Promise((resolve, reject) => {
        console.log("run");
        setTimeout(reject, 5);
    });
}

async function displayPromiseResults() {

    try {
        await iReturnPromise();
        console.log('!then');
    }

    catch(ex) {
        console.log("cought!");
    }

}

displayPromiseResults();
0 голосов
/ 07 декабря 2018

Обещания являются многоадресными, поэтому каждый раз, когда вы вызываете .then или .catch, вы получаете новый объект (цепочку) обещаний.То есть p.then и p.catch оба возвращают свои собственные отдельные объекты обещания.Это означает, что для p.then.

не существует пути перехвата. Если объединение обещаний невозможно, вам придется обработать ошибку в новой цепочке обещаний, созданной .then.Вы можете проглотить это исключение, если захотите, но оно является отдельным исключением:

p.then(function() {
    console.log("then!");
}).catch(() => {});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...