Javascript обещания - поймать с / без функции - PullRequest
0 голосов
/ 18 января 2019

Я только начал изучать JavaScript и обещания несколько часов назад, и я начинаю понимать «поток», но некоторые детали все еще неясны.Давайте рассмотрим следующий пример:

function OnRejected(var){  
    return console.log("This is an error " + var)  
}

Promise.reject(2).then(function(a){return a*2})  
    .then(function(a){return a+5})  
    .then(function(a){return a*3})  
    .then(console.log)  
    .catch(OnRejected) 

Результат приведенного выше кода: это ошибка 2
Пример выше работает просто отлично.У меня такой вопрос: если я не вызываю функцию и пытаюсь напрямую вызвать "console.log (" это ошибка ")" внутри перехвата, почему это не получается?Например:

Promise.reject(3).then(function(a){return a*2})
    .then(function(a){return a+5})
    .then(function(a){return a*3})
    .then(console.log)
    .catch(console.log("This is an error"))

Результат:

(узел: 39515) UnhandledPromiseRejectionWarning: 3
Это ошибка
(узел: 39515) UnhandledPromiseRejectionWarning: необработанное отклонение обещания.Эта ошибка возникла либо из-за того, что внутри асинхронной функции возникла ошибка без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch ().(идентификатор отклонения: 2)
(узел: 39515) [DEP0018] Предупреждение об устаревании: отклонение необработанного обещания устарело.В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом выхода.
Процесс завершен с кодом завершения 0

Я полагаю, что это больше, чем "обещания"мое отсутствие знаний о функциях в JS, console.log и console.log («что угодно»).Любая помощь или совет очень ценятся.

1 Ответ

0 голосов
/ 18 января 2019

catch() и then() ожидают получить функцию в качестве аргумента. В вашем примере OnRejected - это функция, а console.log("This is an error") - нет.

Чтобы объяснить немного больше: console.log является функцией, но console.log('something') является результатом выполнения функции console.log с аргументом 'something'.

Чтобы вернуться к catch() и then(), они вызовут метод, который вы ему дадите (в вашем примере: OnRejected), и вызовете его с аргументом, независимо от того, что было возвращено ранее разрешенным обещанием.

Пример:

getDataFromDistantServer().then(function (data) => {
    console.log(data)
    return otherCallToOtherServer()
}).then( function (dataFromOtherServer) => {
    console.log(dataFromOtherServer)
})

Это также будет работать, потому что doSomething является функцией:

var doSomething = function(data) {
    console.log(data)
    return otherCallToOtherServer()
}

getDataFromDistantServer()
    .then(doSomething)
    .then( function (dataFromOtherServer) => {
        console.log(dataFromOtherServer)
    })

Примечание : соглашение об именах для вашей функции OnRejected будет предписывать не начинать имя с заглавной буквы и называть его onRejected

...