Maison  >  Questions et réponses  >  le corps du texte

then(onFulfilled, undefined) - then(undefined, onRejected) - Pourquoi catch() remplit-il la promesse renvoyée ?

J'essaye ce code :

let with999 = Promise.resolve(999);

let returnCatch = with999
.catch(reason => {
  console.log("catch: " + reason);
});

returnCatch.then(data => {
  console.log("then: " + data);
});

Quand j'ai soudain réalisé :

Promessewith999履行 因此 catch() 方法未执行< /strong>,但是,catch() 返回的 Promise(在本例中为 returnCatch)最终fulfilled,其值与 相同>with999.

Alors, ma question est : pourquoi catch() 最终实现了 returnCatch promettre ?

Je m'attendais à returnCatch挂起(因为 catch() non exécuté) et en utilisant then()< /code> rien ne se passe.

La même chose se produit avec "faire le contraire", then()then() Rejeter une promesse :

let rejected = Promise.reject(new Error('Ups!'));

let returnThen = rejected
.then(reason => {
  console.log("then: " + reason);
});

returnThen.
catch(data => {
  console.log("catch: " + data);
});

Quelqu'un peut-il m'expliquer ce qui se passe ?

P粉446800329P粉446800329187 Il y a quelques jours360

répondre à tous(2)je répondrai

  • P粉111627787

    P粉1116277872024-03-31 11:54:44

    Le code revient à enchaîner .then et .catch à la promesse initiale. Ce n'est pas le cas, créer une nouvelle variable pour le catch nécessite de la rejeter puis de la rediriger vers la suivante.

    Pensez-y comme si vous écriviez la même instruction à la fois sans utiliser plusieurs variables, le comportement a plus de sens. Puisque la promesse est résolue, le premier .then sera exécuté, et si la promesse est rejetée, le premier .catch sera exécuté, quel que soit leur ordre ou leur déclaration ou le nombre de variables que vous utilisez pour ce faire.

    Modifier : Cet extrait de code est le même que celui ci-dessus, transmettant la même promesse.

    let with999 = Promise.resolve(999).catch(reason => {
      console.log("catch: " + reason);
    }).then(data => {
      console.log("then: " + data);
    });

    répondre
    0
  • P粉464082061

    P粉4640820612024-03-31 10:54:30

    Il est toujours difficile de répondre à la question « pourquoi », mais elle se résume essentiellement à ceci : parce que cela fonctionne.

    Peut-être que le rappel de catch() 传递履行结果的行为来看,这一点并不是很明显,但请看一下 .then() 传递的第二个示例关于拒绝:我们希望执行.catch()回调,以处理承诺链中早期出现的任何错误。我们不希望 Promise 链在中间停止(Promise 保持挂起状态),因为出现错误并且 .then() n'a pas été exécuté.

    Vous avez réalisé que ce comportement est dans la .then(handleResult).catch(handleError) 之间是对称的。但请注意,这些实际上只是 .then(handleResult, null).then(null, handleError) 的简化语法。 then méthode qui a en fait deux paramètres, un pour gérer l'accomplissement et un pour gérer le rejet. Vous pouvez (et devriez généralement) réussir les deux examens en même temps.

    .then() 返回的 Promise 会根据相应处理程序的结果进行解析(如果调用抛出异常则被拒绝),Promise 链背后的想法是它总是在最初的承诺得到解决后才得到解决。如果未提供相应的回调,则默认情况下仅传递结果 - 无论是 .then(null, null).then(null, handleError) 均已满足Promise 或被拒绝的 Promise 上的 .then(handleResult, null).

    répondre
    0
  • Annulerrépondre