Discuss / JavaScript / catch和then互换位置

catch和then互换位置

Topic source

devil3lood

#12 Created at ... [Delete] [Delete and Lock User]

回复

庸人自扰Ray

这和箭头函数有什么关系呢?

我指的是promise的catch方法会返回一个新的promise对象

按照mdn的promise页面

我们可以用 promise.then()promise.catch() 和 promise.finally() 这些方法将进一步的操作与一个变为已敲定状态的 promise 关联起来。这些方法还会返回一个新生成的 promise 对象,这个对象可以被非强制性的用来做链式调用

而在您最初的发言中在.then与.catch的语句中的箭头函数中始终调用的都是最初的promise对象,输出结果必然会是一样的且没有意义。

建议您在发言之前请多多思考一下。

英语读报

#13 Created at ... [Delete] [Delete and Lock User]

1. 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

Reply