funcție - Salvează argumentele pentru mai târziu Javascript
Titlul acestei întrebări este probabil înșelător. Am dificultăți să înțeleg acest concept. Vreau să transmit toate argumentele într-o funcție, dar să o apelez cu acele argumente mai târziu.
În prezent fac ceva de genul acesta:
function copyRecords(userId, options) {
const getRecordsWrapper = (userId, options) => () => getRecords(userId, options);
abstractionService = new MyAbstractionService(getRecordsWrapper);
...etc
}
Aici aș salva și apoi aș apela funcția:
class MyAbstractionService {
constructor(getRecords) {
this.getRecords = getRecords;
}
performSomeAction() {
return this.getRecords();
}
}
Trebuie să fac asta pentru că getRecords ia argumente diferite în zone diferite și vreau să le abstrag într-un singur serviciu fără a fi nevoie să transmit o mulțime de argumente serviciului. Asta va deveni dezordonat, deoarece trebuie să fac asta și pentru alte funcții.
Mă gândesc corect la asta? Există o altă modalitate de a face asta în afară de a avea o funcție care returnează o altă funcție care returnează funcția mea? De asemenea, nu sunt sigur dacă asta e important, dar getRecords returnează un Promise. Totuși, nu vreau să încep să lucrez cu Promise până când nu ajung mai târziu în serviciul de abstractizare.
Răspuns #1
În termeni de programare funcțională, ceea ce descrii este Currying, iar în JavaScript poți realiza cea mai simplă idee a acestuia folosind funcția bind():
const getRecordsWrapper = getRecords.bind(null, userId, options);
Primul argument transmis la bind este contextul funcției (adică this) al funcției care urmează să fie apelată mai târziu, în timp ce restul argumentelor sunt transmise ca argumente obișnuite.
Dacă cauți un cadru de programare funcțională complet în JavaScript, aruncă o privire la Ramda.js (de exemplu).
Răspunsul #2
Folosirea bind() este o idee bună. Iată o alternativă. Lăsăm cititorilor să decidă care este preferată.
function copyRecords(userId, options) {
return () => {
return getRecords(userId, options);
}
};
Rețineți că acest lucru este practic identic cu:
function copyRecords(userId, options) {
return getRecords.bind(this, userId, options);
};
Așadar, totul se reduce la o preferință subiectivă.
