首页 > 解决方案 > Javascript 承诺 - 使用/不使用功能捕获

问题描述

几个小时前我刚开始学习 JavaScript 和 promises,我开始掌握“流程”,但还有一些细节还不清楚。让我们看下面的例子:

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("this is an error")”,为什么会失败?像这样:

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() 处理的承诺。(拒绝 id:2)
(节点:39515)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。
进程以退出代码 0 结束

不仅仅是“承诺”,我相信我缺乏关于 JS、console.log 和 console.log(“whatever”) 中的功能的知识。非常感谢任何帮助或建议。

标签: javascriptpromiseconsole.log

解决方案


catch()then()期望接收一个函数作为参数。在您的示例中,OnRejected是一个函数,而console.log("This is an error")不是。

多解释一点:console.log是一个函数,但它是带参数console.log('something')的函数的执行结果。console.log'something'

回到catch()and 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


推荐阅读