Προς το περιεχόμενο

χρηση του rejected μεσα σε then ενος promise


slevinkelevra

Προτεινόμενες αναρτήσεις

Τα promises της javascript εχουν στο callback τους και ενα rejected, το οποίο δε χρησιμοποιειται ποτε μεσα στο then για error handling. Συνηθως χρησιμοποιειται το catch. 

Για παραδειγμα

const whatever = () => {
  return new Promise((resolved, rejeted)=>{
	resolved('all good');
  })
};

Στο then δε χρησιμοποιειται ποτε το rejected, μονο το resolved και το catch.

  signup.whatever()
  .then((resolved)=>{                
         console.log('resolved',resolved);         
      })
    .catch((err)=>{       
       console.log('err', err);
    });
});

Αρα το rejected γιατι υπαρχει? 

Παιζωντας προχειρα με αυτο το απλο παραδειγμα, μπορουν να χρησιμευσουν τα rejected για debugging ή για monitoring του then chain ή ακομα και αν υπάρχει καποιο λαθος μεσα στο then chain 

const whatever = () => {
  return new Promise((resolved, rejeted)=>{
    rejeted('promises send a rejection');
  })
};
//
whatever()
  .then(
      (resolved)=>{   
         throw 'then first throws fake error';// force another error in then chain
         console.log('then first resolved',resolved);
         return resolved;
      },
      (rejeted)=>{
        console.log('then first rejeted - ',rejeted);
        throw 'then first throw';
      }
    )
    .then(
        (resolved)=>{
           console.log('then second resolved',resolved);
        },
        (rejeted)=>{
          console.log('then second rejeted - ',rejeted);
          throw 'then second throw';
        }
      )
    .catch((err)=>{
       console.log('then catch - ', err);
    });

Αυτο βοηθάει στο debugging ή αν θες να πεις στον χρηστη ή σε αλλο κωδικα τι εγινε σε καθε βημα και τι πηγε στραβα σε καθε βήμα.

Προσθέτωνας ή αφαιρωντας το error στην promise ή στο then, παιζεις με τα αποτελεσματα. Χωρίς τα rejected περνεις το "αρχικο" λαθος απο το catch, χωρις να ξερεις τι εγινε ενδιαμεσα. Χωρις το catch ομως, τα rejected περνανε errors το ενα στο άλλο, αλλά δεν υπαρχει ποτέ κατι τελικο, παιζει και να καταληξεις με ενα error σχετικο με το then chain, που δε σε βοηθαει πουθενα.

Οπότε με rejected+catch η χρησιμοτητα ειναι ιδια : εχεις αναλυτικές αναφορες, ο κωδικας συνεχίζει μέχρι να βρει το catch, το οποιο και σηματοδοτει το τελος του chain και διαχειρίζεται οτι εχει μαζευτει πιο πανω. Όλα αυτα βέβαια αν τα rejected εχουν throw μεσα. Αλλιως, το πρωτο rejected μαζευει το όποιο λαθος (είτε απο promise ειτε απο then) και μετα παλι παιζει  να καταληξεις με ενα error σχετικο με το then chain, που δε σε βοηθαει πουθενα. Η με undefined.

Για το παραπανω σεναριο δεν ειμαι σιγουρος, ειναι κατι που σκεφτηκα, αλλα δε ξερω αν ειναι σωστο ή αν αυτη ειναι η σωστη χρηση του rejected. Οποτε το ερωτημα μου παραμενει, Αρα το rejected γιατι υπαρχει? Πως μπορει να χρησιμοποιηθει αποτελεσματικα μεσα στο promise και μεσα στο then ? 

Παιδια , please explain like I am 5 , το χω κάψει σημερα με τα πολλα promises. Παω να δω καμια ρομαντικη κομεντι με broken promises ή κατι τετοιο.

Ευχαριστω

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βασικά, αν δεν υπήρχε το reject δεν θα μπορούσε να λειτουργήσει το catch.

Φαντάσου το εξής

goGetSomething()
	.then(success)
	.then(null, catch) // hint

Γιατί να μην φτιάξουμε κάτι που να το κάνει αυτό αλλά να φαίνεται πιο όμορφα?

doThatThing()
	.then(success)
	.catch(errorCallback)

Δηλαδή το catch είναι ένα μασκαρεμένο .then στην ουσία.

Συμφωνώ γενικά με την άποψη του .catch κυρίως γιατί είναι και πιο ξεκάθαρο αλλά και ο τρόπος που θα έφτιαχνες και ένα κλασικό try / catch block αλλά υπάρχουν και περιπτώσεις που θα βόλευε η άλλη περίπτωση, όπως πχ να κάνεις resolve ή reject μέσα από το promise callback fn με κάποια λογική, δεν μου έρχεται στο μυαλό τώρα κάποιο πραγματικό παράδειγμα :/

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Thanks, το παραδειγμα με το 

.then(null, catch) 

με βοηθησε αρκετα να καταλαβω την εννοια του catch σε ενα επιπεδο παραπανω. 

 

Και γω ψαχνω καποιο πραγματικο παραδειγμα με το reject μεσα απο το promise callback , αλλα δεν βρισκω κατι. 

Anyway, τουλαχιστον μπορεις να το εχεις και αυτο για debugging

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αναφορά σε κείμενο

Στο then δε χρησιμοποιειται ποτε το rejected, μονο το resolved και το catch.

Τα έχεις μπερδέψει εντελώς :) Δες παρακάτω:

new Promise(psarema)
.then(stoThgani)
.catch(tonPoyloPaneAgorase)

function psarema(epiasa, tonHpia) {
  setTimeout(() => {
    epiasa(['sfyrides', 'gavro']);
    // tonHpia('boyliakse h barka');
  }, 1000)
}

function stoThgani(psaria) {
  console.log(psaria);
}

function tonPoyloPaneAgorase(tiEgineReMegale) {
  console.log(tiEgineReMegale);
}

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι , οκ εχεις μια Promise με ενα success (epiasa) και ενα fail(tonHpia) και μετα καλεις ενα then και ενα catch πανω σε οτιδηποτε αποτελεσμα γυρισει. 

Το then ομως μπορει να εχει και ενα reject μεσα το οποιο ειναι optional. Ρωτησα που χρησιμοποιείται λοιπον το reject μιας και σχεδον ολα τα παραδειγματα δεν το βαζουν, βaζουν μονο το catch. Συμφωνα με το documentation, κυρις χρησιμοποιείται For debugging purposes and selective error catching, it is useful to make reason an instanceof Error.

Οποτε μπορεις να το χρησιμοποιήσεις οπως εγω παραπανω, η οπως στο παραδειγμα του documentation ή αν εχεις μονο ενα than και δεν εχεις chain απο πολλα then, δε βαζεις catch, βαζεις ενα then και μεσα ενα resolve και ενα reject και ειναι συντακτικα πιο μαζεμενο I would assume. 

 

Στη πραξη

new Promise(psarema)
.then(stoThgani ,tsekarismaLathousKaiEdo)
.catch(tonPoyloPaneAgorase)

function psarema(epiasa, tonHpia) {
    //epiasa(['sfyrides', 'gavro']);
     tonHpia('boyliakse h barka');
}

function stoThgani(psaria) {
  console.log(psaria);
}

function tonPoyloPaneAgorase(tiEgineReMegale) {
  console.log('error apo to catch : ', tiEgineReMegale);
}
function tsekarismaLathousKaiEdo(giaPes){
  console.log('error apo to reject tou then : ', giaPes);
}

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Η βασικότερη διαφορά εν ουσία (υπάρχουν μερικές, αλλά με λίγο κώδικα έτσι ή αλλιώς όλα γίνονται ισοδύναμα) είναι ότι αν έχεις

promise.then(foo, bar)

τότε σε περίπτωση που γίνει reject ή error μέσα στη foo, η bar δεν θα μπορεί να το διαχειριστεί. Αντίθετα αν

promise.then(foo).catch(bar)

μπορεί, και συνήθως αυτό είναι που θέλεις.

Εννοείται βέβαια ότι μπορείς να κάνεις το ίδιο και ως .then(foo).then(null, bar) αλλά όταν είναι γνωστά τα callbacks όπως εδώ είναι άσχημο.

  • Thanks 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δες τι θα γίνει σε αυτό (είναι αυτό που είπε ο defacer):

new Promise(psarema)
.then(stoThgani ,tsekarismaLathousKaiEdo)
.catch(tonPoyloPaneAgorase)

function psarema(epiasa, tonHpia) {		
	 epiasa(['sfyrides', 'gavro']);
     //tonHpia('boyliakse h barka');
}

function stoThgani(psaria) {

  	throw new Error('kophke to reyma, akyro psaroylh');
    
    return 'psi8hkan';
}

function tonPoyloPaneAgorase(tiEgineReMegale) {
  console.log('error apo to catch : ', tiEgineReMegale);
}
function tsekarismaLathousKaiEdo(giaPes){
  console.log('error apo to reject tou then : ', giaPes);
}

 Οπότε ακόμα και με ένα then, το catch είναι καλύτερη επιλογή.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...