catch和then互换位置
Topic source1. Promise()需要传入一个函数,这个函数有2个参数,分别是2个函数名
new Promise(function(){}) //"pending
new Promise(function(fn1, fn2){}) //"pending
2. 如果第一个函数执行了,则Promise的状态变为 fulfilled
i1=new Promise(function(fn1, fn2){ fn1("fn1 run")}); i1
//[[PromiseState]]: "fulfilled"
//[[PromiseResult]]: "fn1 run"
3. 如果第二个函数执行了,则Promise的状态变为 rejected,同时报错
i2=new Promise(function(fn1, fn2){ fn2("fn2 run")}); i2
//[[PromiseState]]: "rejected"
//[[PromiseResult]]: "fn2 run"
Uncaught (in promise) fn2 run
4. 如果接着执行 .then(fnSucceed(arg1){}, fnFailed(arg1){}),
(1) 之前状态是 fulfilled 执行前面的函数
i1.then(function(arg1){console.log("1", arg1)}, function(arg1){console.log("2", arg1)}) //1 fn1 run
(2) 之前状态是 rejected 执行后面的函数
i2.then(function(arg1){console.log("1", arg1)}, function(arg1){console.log("2", arg1)}) //2 fn2 run
(3) 对于错误的,还可以链式执行一个.catch(),Promise的状态再次变为 fulfilled
i2_=i2.catch(function(arg){ console.log("Error:", arg) }); //Error: fn2 run
i2_
//[[PromiseState]]: "fulfilled"
//[[PromiseResult]]: undefined
来自GitHub Copilot:
这个问题的原因在于你将 catch
和 then
的顺序调换了。在 Promise 链中,then
用于处理 Promise 的成功状态,而 catch
用于处理 Promise 的失败状态。
当你将 catch
放在前面时,它会捕获前面 Promise 的错误,并返回一个新的 Promise,这个新的 Promise 是成功的状态。然后,这个成功的 Promise 会被后面的 then
处理。
在你的代码中,当 timeOut
大于 1 时,Promise 会被拒绝,然后被 catch
处理。catch
处理完后,会返回一个成功的 Promise,这个 Promise 会被后面的 then
处理。但是,这个成功的 Promise 并没有值,所以 then
的处理函数接收到的 reason
是 undefined
。
- 1
- 2
devil3lood
回复
庸人自扰Ray
这和箭头函数有什么关系呢?
我指的是promise的catch方法会返回一个新的promise对象
按照mdn的promise页面
而在您最初的发言中在.then与.catch的语句中的箭头函数中始终调用的都是最初的promise对象,输出结果必然会是一样的且没有意义。
建议您在发言之前请多多思考一下。