Javascript许诺-捕获有无功能

时间:2019-01-18 10:08:09

标签: javascript promise console.log

我刚刚开始学习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
上面的例子很好用。我的问题是:如果我不调用函数,而是尝试直接在catch中调用“ 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)UnhandledPromiseRejection警告:3
这是一个错误
(节点:39515)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。引发此错误的原因可能是抛出了一个没有catch块的异步函数,或者是拒绝了一个.catch()无法处理的承诺。 (拒绝ID:2)
(节点:39515)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。
流程结束,退出代码为0

我相信我对JS,console.log和console.log(“ whatever”)中的函数的了解不多。任何帮助或建议都非常感谢。

1 个答案:

答案 0 :(得分:1)

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