узел 8.6 обещания JavaScript: UnhandledPromiseRejectionWarning - PullRequest
0 голосов
/ 30 июня 2018

У меня ошибка: (узел: 6186) UnhandledPromiseRejectionWarning: Необработанный отказ от обещания (идентификатор отклонения: 1): тройка (узел: 6186) [DEP0018] Предупреждение об устаревании: отклонение необработанного обещания устарело. В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом завершения. -------- из них ========= два CaughtCathchError тройка (узел: 6186) PromiseRejectionHandledWarning: Отклонение обещания было обработано асинхронно (идентификатор отклонения: 1) Я использую свои 3 функции обещания во вложенном порядке. p1, p2, p3 - мои функции обещания, как показано ниже. я попытался добавить обещание отклонить во всех функциях p1, p2, p3, но он все тот же

enter code here
var p1 = new Promise(function (resolve, reject) {
    setTimeout(function () {
       // resolve('ones')
                resolve('ones')
    }, 9000)
})
var p2 = new Promise(function (resolve, reject) {
    setTimeout(function () {
        // throw new Error('eeeee');
        //reject('two')
    resolve('two')
    }, 1000)
})
var p3 = new Promise(function (resolve, reject) {
    setTimeout(function () {
        reject('three')
    }, 4000)
})

p1.then(function(result){
    console.log("--------", result)
        // return p2.then(function(res){console.log(res)}).catch(function(err){console.log(err)})
        return p2
}).then(function(p2result){
    console.log("=========", p2result)
    return p3;
}).then(function(p3result){
    console.log('*********', p3result)
}).catch(function(err){
    console.log("CaughtCathchError", err)
})

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Если вы хотите создать обещание отклонения / отклонения, которое будет отслеживаться в очереди, а не в стеке, вы можете сделать следующее:

var p3 = new Promise(function (resolve, reject) {
    setTimeout(function () {
        reject('three')
    }, 400)
});
//do not warn for p3 rejection but if you use it later (p3.then) or
//  return it in a promise chain you will have to catch it again
p3.catch(ignore=>ignore);
0 голосов
/ 30 июня 2018

Реализация обещания Node.js предполагает, что отклоненное обещание будет синхронизировано с catch(...) или then(..., ...), в противном случае появляется PromiseRejectionHandledWarning. Отказ от необработанного обещания может привести к исключению в будущем.

Обычно отклонение следует рассматривать как любую другую ошибку, поэтому предпочтительно, чтобы это был экземпляр Error, а не простая строка. Тогда это можно трактовать так:

class ExpectedRejection extends Error {}

var p3 = new Promise(function (resolve, reject) {
    setTimeout(function () {
        resolve(new ExpectedRejection('three'))
    }, 4000)
})

...
.then(function(p3result){
  if (p3result instanceof ExpectedRejection)
    throw p3result;

  console.log('*********', p3result)
}).catch(function(err){
    console.log("CaughtCathchError", err)
})

ExpectedRejection класс специфичен и, возможно, не нужен; можно заменить на Error везде, потому что Error разрешения встречаются редко.

Это решение не очень распространено, потому что, если обещания создаются одновременно, они не зависят друг от друга и обычно могут обрабатываться с помощью Promise.all:

Promise.all([p1, p2, p3])
.then(function(p1result, p2result, p3result){
    console.log('*********', p3result)
}).catch(function(err){
    console.log("CaughtCathchError", err)
});

Обратите внимание, что поскольку p1, p2 и p3 являются задержками, которые создаются одновременно, в результате catch будет запущено через 9 секунд (максимальная продолжительность задержки) в обоих случаях.

0 голосов
/ 30 июня 2018

p3 является автономным Обещанием без .catch. Итак, когда p3 получает reject ed, вы получаете UnhandledPromiseRejectionWarning. Даже если p3 потребляется позже в цепочке Promise с правильной catch, p3 сама по себе не имеет catch.

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

var p1 = new Promise(function (resolve, reject) {
    setTimeout(function () {
       // resolve('ones')
                resolve('ones')
    }, 1000)
})
var p2 = new Promise(function (resolve, reject) {
    setTimeout(function () {
        // throw new Error('eeeee');
        //reject('two')
    resolve('two')
    }, 1000)
})
var getp3 = () => new Promise(function (resolve, reject) {
    setTimeout(function () {
        reject('three')
    }, 1000)
})

p1.then(function(result){
    console.log("--------", result)
        // return p2.then(function(res){console.log(res)}).catch(function(err){console.log(err)})
        return p2
}).then(function(p2result){
    console.log("=========", p2result)
    return getp3();
}).then(function(p3result){
    console.log('*********', p3result)
}).catch(function(err){
    console.log("CaughtCathchError", err)
})

Если вам нужно немедленно инициализировать p3, затем поставьте catch после самого p3.

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