Then ohne promise?

Hendoul

Commander
Registriert
Apr. 2008
Beiträge
2.054
Hi :)

Folgender Code verstehe ich nicht ganz:
Javascript:
function foo(done) {
    fetchSomething(someData)
    .then(result => {
        const x = result.value;
    })
    .then(done);
}

Der Inhalt vom ersten 'then' führt ja keinen async code aus. Ich verstehe nicht, warum man ein zweites 'then' macht mit lediglich dem Aufruf 'done'. Was gibt denn das erste then zurück? Ein Promise das sogleich resolved ist?

Könnte man auch den 'done' Aufruf gleich ins erste 'then' ans Ende packen und man hätte den gleichen Effekt?

Schlussendlich habe ich das Problem, dass wenn ich das ganze mit Jasmine unit-testen möchte, ich den call von 'done' nicht tracken kann. Und ich denke das liegt daran, dass ich irgendwie das erste then auflösen müsste?
 
Hendoul schrieb:
Ein Promise das sogleich resolved ist?
Jop. Das ist schon manchmal hilfreich um eigene Events auszulösen. Manche Berechnungen (Canvas/Image Crop zb) dauern auch eine Weile, da will man nicht darauf warten an anderen Stellen im Code, daher schiebt es gut in den asyncronen Bereich.

woher hast du denn .then(done); her bzw glaubst das es da sein muß? Ist done() eine funktion?

für ein weiteres .then() müsste doch auch ein neues Promise gemacht werden mmn, siehe:
https://stackoverflow.com/questions/49033694/how-to-use-then-in-node-js


hier ein Beispiel mit Croppie (myFeature = this):

Javascript:
      get_cropped_image: function(croppie_image){                    
        var info = this.info,
            myFeature = this;
        
        return new Promise(function(resolve, reject) {                 
          var image = document.createElement('img');
    
          image.src = croppie_image;

          // asyncron -> deswegen das alles
          image.onload = function(){
            ...
            
            resolve(canvas.toDataURL('image/png'));
          };
        });
      },

// später:
                  this.$image_crop.croppie('result', {
                
                    type: 'base64',
                    size: { height: 150 },
                
                  }).then(function(croppie_image){
                    myFeature.get_cropped_image(croppie_image).then(function(cropped_image_dataURI){
                
                      info.selected[section_name].image = cropped_image_dataURI;
                      info.selected[section_name].param_value = myFeature.image_blob(info.selected[section_name].image);
                
                      // all features "designer_update" method will be called
                      myTheme.trigger('designer_update', {
                        update_modelService: true,
                        $control_section: $control_section,
                        section_name: section_name,
                        $control: $control,
                        control_name: control_name,
                        selected_control_class: selected_control_class,
                        deselected_control_class: deselected_control_class,
                      });
                  
                      myFeature.$image_crop.croppie('destroy');
                      myFeature.$image_crop.remove();
                    });
                  });
 
Zuletzt bearbeitet:
netzgestaltung schrieb:
woher hast du denn .then(done); her bzw glaubst das es da sein muß? Ist done() eine funktion?
Das done() geht bereits als Argument in seine Funktion foo() rein.
 
  • Gefällt mir
Reaktionen: netzgestaltung
Afaik wird der return eines Promise als Carry im nächsten Promise verwendet. Bei dir im done hättest du nun theoretisch einen ersten Parameter mit Inhalt undefined, null o.ä., da ja keine Rückgabe erfolgt.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise schrieb:
The return value of each resolved promise in the chain is passed along to the next .then(), while the reason for rejection is passed along to the next rejection-handler function in the chain.
Gäbe es ein return im vorherigen then(), würdest du diesen Wert als Parameter erhalten.

https://developer.mozilla.org/en-US...eference/Global_Objects/Promise/then#chaining
 
Danke!

Dennoch müsste im ersten then() mmn ein weiteres Promise zurückgegeben werden OK ein einfaches return reicht für ein weiteres then.
done() direkt aufzurufen ist sicher kein problem. aber wenn der callback als variable reinkommt würd ich das noch auf typ usw kontrollieren vor dem aufruf.
 
Das zweite then() wird einfach synchronous gefeuert, wenn du im vorherigen then() keinen return hast.
 
Zurück
Oben