javascript - 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”) 中的功能的知识。非常感谢任何帮助或建议。
解决方案
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
推荐阅读
- javascript - React-Jest Formio js 测试问题
- c - Bash 脚本错误“未定义对 sin 的引用”
- python - OmegaConf 我可以影响列表的合并方式吗
- android - 应用因隐私政策 url 问题而被拒绝,但商品详情中没有隐私政策字段
- flutter - 如何使用 Rows 在视图中显示异步列表并使其成为按钮?
- imagemagick - 任何可以超过 JPEG 最大分辨率限制的文件类型?
- javascript - React-Spring:无效的 Hooks 调用
- java - 如何停止以前的 MediaPlayer.create(this,resID) 并运行下一个 MediaPlayer.create(this,resID)
- javascript - 从对象列表中获取唯一属性列表的快速方法
- swift - 从数组中引用变量时,如何更改变量的值?