2017-08-29 1 views
0

Je viens d'arriver avec une curiosité de promesses. Si je rejette directement dans une chaîne, je peux attraper la variable plus tard.Le rejet de la promesse n'est pas répercuté sur la capture, s'il est stocké dans la variable

Si je rejette sur la variable, je ne peux pas attraper du tout. La promesse est toujours considérée comme résolue dans ce cas:

let proMISS = Promise.resolve(); 
 
proMISS.then(() => console.log('THEN 1')) 
 
     .then(() => Promise.reject()) 
 
     .then(() => console.log('THEN 2')); 
 

 
setTimeout(() => { 
 
    proMISS.catch(() => console.log('CATCH')); 
 
}, 1000);

Cela fait en effet le travail: semble

let PROmiss = Promise.resolve() 
 
        .then(() => console.log('THEN 1')) 
 
        .then(() => Promise.reject()) 
 
        .then(() => console.log('THEN 2')); 
 

 
setTimeout(() => { 
 
    PROmiss.catch(() => console.log('CATCH')); 
 
}, 1000);

Cela ne veut pas être déterministe

Répondre

1

Je viens de trouver la réponse, je suppose.

La promesse dans la variable est résolue, mais pas la chaîne. Par conséquent, si vous attrapez la variable, elle doit être résolue.

Vous devez enregistrer le dernier membre de la chaîne, chaque fois que vous ajoutez un membre.

1

Vous faites essentiellement

let promise1 = Promise.resolve(); 
let promise2 = promise1.then(() => console.log('THEN 1')) 
     .then(() => Promise.reject()) 
     .then(() => console.log('THEN 2')); 
setTimeout(() => { 
    promise1.catch(() => console.log('CATCH')); 
    promise2.catch(() => console.log('CATCH')); 
}, 1000); 

Oui, promise1 est différent de promise2. Le premier est rempli avec undefined, tandis que le second est rejeté.

0

let proMISS = Promise.resolve(); 
 
let promissTwo = proMISS.then(() => console.log('THEN 1')) 
 
     .then(() => Promise.reject()) 
 
     .then(() => console.log('THEN 2')); 
 

 
setTimeout(() => { 
 
    promissTwo.catch(() => console.log('CATCH')); 
 
}, 1000);
Vous devez prendre la sortie de la première chaîne de promesse dans une variable et alors seulement vous pouvez gérer le rejet. J'ai pris la sortie proMISS de la chaîne dans une nouvelle variable promissTwo puis j'ai traité

Votre deuxième exemple fonctionne sur le même concept.