Vraag Zijn er verschillen tussen .then (functionReference) en .then (functie (waarde) {return functionReference (value)})?


Gegeven een benoemde functie gebruikt om een ​​te verwerken Promise waarde

function handlePromise(data) {
  // do stuff with `data`
  return data
}

a) De genoemde functie passeren handlePromise als een verwijzing naar .then()

promise.then(handlePromise)

b) Gebruik van een anonieme of benoemde functie als parameter voor .then() en het retourneren van de benoemde functie handlePromise met Promise waarde als parameter binnen de hoofdtekst van de anonieme of benoemde functie die is doorgegeven aan .then()

promise.then(function /*[functionName]*/(data) {return handlePromise(data)})

vragen

  1. Zijn er verschillen tussen patronen a) en b)?

  2. Als het antwoord op 1. Ja is, wat zijn dan de verschillen overwogen bij het gebruik van een patroon?


11
2017-12-16 19:20


oorsprong


antwoorden:


Het is mogelijk om een ​​geval te creëren waarbij er een verschil is wanneer geen argument wordt doorgegeven, maar het is een stuk en over het algemeen moet je slagen f en niet function(x) { return f(x); } of x => f(x) omdat het schoner is.

Hier is een voorbeeld dat een verschil veroorzaakt, de reden is dat functies die parameters aannemen, bijwerkingen kunnen veroorzaken met die parameters:

function f() {
   if(arguments.length === 0) console.log("win");
   else console.log("Hello World");
}
const delay = ms => new Promise(r => setTimeout(r, ms)); // just a delay
delay(500).then(f); // logs "Hello World";
delay(500).then(() => f()) // logs "win"

5
2017-12-17 00:38



Er is geen verschil, function(x){return f(x)} === f.

Voor meer informatie, wil je misschien meer lezen eta-conversie in lambda-calculus.


2
2017-12-16 19:23



Logica

Vanuit een logisch perspectief is er niets dat hen uit elkaar zou kunnen halen.

Bron

Vanuit een broncode en stijlperspectief is mijn persoonlijke smaak tegen inline-functieverklaringen omdat ze moeilijker te lezen zijn (bij het lezen van de code van iemand anders, wanneer het lezen van mijn eigen is een kunstwerk LOL)

debugging

Vanuit een foutopsporingsperspectief wanneer het nesten diep wordt, is het moeilijker om fouten te debuggen als je een lange stapel sporen van anonieme oproepen hebt.

Prestatie

Vanuit een prestatieperspectief is het browserafhankelijk. Zonder significant verschil met behulp van Firefox. Chrome Canary 60 en alle eerdere versies gebruiken. Inline anonieme functie-declaraties zijn aanzienlijk langzamer na de eerste oproep dan gedefinieerde functie-instructies en functie-uitdrukkingen. Dit geldt voor zowel traditionele als pijlfuncties.

Vergelijking van de twee alternatieven en timing van de while-lus alleen

var i,j;
const f = a => a;
j = i = 10000;

while(i--) f(i);  // timed loop


while(j--) (a=>a)(j); // timed loop

De vooraf gedefinieerde functie wordt 870% sneller uitgevoerd dan de inline-functie.

Maar ik moet nog zien dat iemand beloften gebruikt in prestatie-kritische code, het verschil in tijd op de testmachine (win10 32bit) is 0,0018 μs (*) voor f(i) en 0,0157μs voor (a=>a)(i) 

(*) μs geeft microseconden 1 / 1.000.000ste van een seconde aan

Conclusie

De verschillen zijn klein tot onbeduidend, meer een kwestie van persoonlijke smaak en stijl dan wat dan ook. Als je in een team werkt, gebruik dan de stijl die in hun stijlgids wordt geschetst, als je projectleider bent of alleen werkt, gebruik dan waar je het meest comfortabel mee bent.

Het randgeval zoals getoond in BenjaminGruenbaum antwoord ik beschouw geld niet als hij expliciet f () in roept then(()=>f()) zonder een argument. Dat is hetzelfde als const ff = () => f(); delay(0).then(ff) en geen gril van hoe de functie is gedefinieerd.


0
2018-05-21 12:26



Er is inderdaad één belangrijk verschil, maar niet zo belangrijk, dat eigenlijk moet worden vermeden. Als u handlePromise () aanroept als direct binnenin (), mag u geen externe parameters toevoegen. Als je het binnen de functie noemt, die dan binnen is .then( (result) => handle(result, someOtherParam) )dan kun je 'someotherparam' toevoegen om te bellen. Het is handig als je een grotere telefooncel hebt, hoewel ik dat zou vermijden en het door de hele keten van beloften heen zou geven.

TLDR; de eerste wordt aangeroepen met .then () resultaten als parameters, de laatste is elastisch in wat je verder wilt doorgeven.


0
2018-05-27 18:38