then(onFulfilled, undefined) - then(undefined, onRejected) - Pourquoi catch() remplit-il la promesse renvoyée ?
P粉446800329
P粉446800329 2024-03-30 23:21:22
0
2
355

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粉446800329
P粉446800329

répondre à tous(2)
P粉111627787

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);
});
P粉464082061

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!