Turinys
Ankstesnėse pamokose mes dirbome su klasėmis, todėl mūsų programa tapo moduliškesnė, mes net nuodugniai matėme, kaip atlikti asinchroninį darbą naudojant CoffeeScript kaip kalba, taip suteikdami mums daugiau galimybių dirbti su ja.Įvaldę šias sąvokas, atėjo laikas žengti dar vieną žingsnį ir panaudoti tai, ką žinome, norėdami parašyti švaresnį, funkcionalesnį ir, žinoma, galingesnį kodą. Atėjo laikas išmokti tapti energijos vartotojais CoffeeScript.
Dabar, kai žinome, kaip savo programoje naudoti klases, tik laiko klausimas, kada su ja susidursime. kontekste. Kai dirbame su paprastomis funkcijomis, gana lengva suprasti, kokie duomenys yra šios funkcijos apimtyje, ji žino pasaulinius kintamuosius, kintamuosius, apibrėžtus funkcijoje, ir visus kintamuosius, kurie buvo nustatyti vietos apimtyje, kai buvo sukurta funkcija.
Tačiau kai metodai yra susieti su objektais, tai tampa šiek tiek sudėtingiau. Norėdami tai iliustruoti, pažiūrėkime pavyzdį, kuriame galime pamatyti šią problemą ir tada pamatysime, kaip CoffeeScript gali mums padėti:
klasė Laivo kėlimo inkaras: (doneCallback) -> console.log "Kėlimo inkaras." setVel: (greitis) -> console.log „Greičio nustatymas į # {speed}“ išplaukite: -> @levantarAncla @ fixVel 70Tarkime, kad pagal mūsų kodą norime nedelsiant išplaukti, tam mes atliekame šiuos veiksmus, kad iškviestume savo funkciją:
bot = naujas Barco bot.zarpar ()Jei atidžiai pažvelgsime ir perkelsime šį kodą į realų pasaulį, galime suprasti, kad inkaro pakėlimas įvyksta ne iš karto, turime palaukti, kol inkaras bus visiškai pakeltas, kad galėtume išplaukti. Šią problemą galime išspręsti pridėję a perskambink ir paklausti, ar jis buvo baigtas, todėl žinosime, kiek laiko šis veiksmas užtruks, ir paskambinę atliksime funkciją, pažiūrėkime:
liftAnchor: (doneCallback) -> console.log "Kėlimo inkaras". jei padarytaAtskambink? setTimeout doneCallback, 1000Kaip matome, mes kreipiamės tik į atgalinį skambutį, jei jis egzistuoja, tokiu būdu užtikriname, kad šis procesas bus baigtas, todėl turime pakeisti savo funkciją pakelti bures:
iškelia burę: -> @levantarAncla -> @ fixVel 70Dabar mes naudojame funkciją pakelti bures Pakėlus inkarą, tai užtikrina, kad nejudėsime, kol inkaras nebus visiškai pakeltas. Tai atrodo gana gerai, mes sudarysime savo kodą ir įtrauksime sukurtą .js failą į HTML, kad pamatytume konsolės atsakymą:
Mes norime tai padaryti Este visada yra susijęs su egzemplioriumi bot atgalinio skambučio viduje ir mums pasisekė, nes CoffeeScript jis turi funkcionalumą šiam atvejui. Tam mes deklaruojame funkciją su riebi rodyklė arba stora rodyklė, tokiu būdu funkcija turės Este susietas su kontekstu, kuriame jis buvo paskelbtas, pažiūrėkime, kaip atrodo mūsų kodas atlikus šį pakeitimą:
klasė Laivo kėlimo inkaras: (doneCallback) -> console.log "Kėlimo inkaras." jei padarytaAtskambink? setTimeout doneCallback, 1000 setVel: (greitis) -> console.log "Greičio nustatymas į # {speed}" nustatykite burę: -> @levantarAncla => @fixVel 70 bot = new Barco bot.zarpar ()Surinkime failą ir pažiūrėkime, kaip tai padaryti CoffeeScript Pasiekimų įrišimas naudojant storą rodyklę:
ĮsiminimasKokia technika įsiminimas yra saugoti funkcijos reikšmes, o ne jas perskaičiuoti kiekvieną kartą, kai funkcija iškviečiama. Dabar, kai žinome, kaip naudoti klases ir objektus, galime panaudoti šias žinias, kad jas pritaikytume CoffeeScript ir naudoti aptariamą techniką.
Yra daug būdų, kaip atlikti procesą įsiminimas, šios pamokos atveju mes viską supaprastinsime. Šiuo tikslu mes padarysime tai, kad kai paprašysime tam tikros informacijos, mes patikrinsime, ar ji yra saugoma, jei taip, mes nedelsdami ją grąžinsime, kitaip galime ją apskaičiuoti ir išsaugoti būsimam naudojimui. Ši technika yra labai naudinga, kai atsakymui gauti reikia naudoti sudėtingą algoritmą arba tuo atveju, kai informacijai gauti naudojame lėtą tinklą.
Taigi pažvelkime į kodą, iliustruojantį šią techniką:
klasės raketa getPath: -> @path? = @doMathComplexProcess ()Norėdami geriau paaiškinti šią kodo dalį, mes ją sudarysime, kad pamatytume, kaip CoffeeScript statyti „JavaScript“ kad mūsų technika turės sutaupyti mūsų darbo kuriant, pažiūrėkime, kaip atrodo mūsų kodas:
DIDELIS
Tačiau tai dar ne viskas, ką galime padaryti naudodami naują techniką CoffeeScript, mes netgi galime išsaugoti daugiau nei vieną vertę naudodami duomenų struktūrą, pažiūrėkime, kaip tai padaryti:
class SecurityGateway hasAccess: (guard) -> @access? = {} @access [guard.plate_number]? = = authenticCredentials guard.plate_numberŠi kodo dalis daro tai, kad mūsų objekte rezultatas saugomas kiekvienam sargui, kuris paprašė prieigos, mums reikės tik kažko unikalaus, kad galėtume juos identifikuoti savo objekte, todėl šiai užduočiai naudojame plokštelės numerį, pažiūrėkime kaip išverčiamas mūsų kodas, kai jį sudarome:
DIDELIS
Galiausiai pamatysime būdą, kaip perduoti parinktis funkcijai, o tai nėra ypatinga funkcija CoffeeScriptTai labiau susitarimas, kuriame naudojamos daug kalbos ypatybių, naudojant jas lengvai suprantamu modeliu, kuris yra toks pat naudingas daugelyje galimų situacijų.
Kaip tai veikia?Idėja yra paprasta, tai yra funkcija, kuri tai priima parinkčių objektas kuriuose gali būti asociatyvių raktų tos funkcijos argumentams. Tai leidžia lengvai suprasti parinktis iš kodo, kuriuo jos vadinamos, nes yra garbanotieji skliausteliai, skirti nustatyti, ką daro kiekviena vertė. Tai taip pat sumažina vargą stebint argumentus ir jų tvarką, nes objektų raktai nuo to nepriklauso ir gali būti praleisti, jei to nereikia.
Norėdami įgyvendinti parinkčių objektai pirmiausia mes naudosime neprivalomus argumentus, kad numatytieji būtų tušti argumentai. Tokiu būdu, skambindami, galime praleisti parinktis, jei vertės nėra reikalingos:
launchNave = (vardas, parinktys = {}) -> grįžti, jei parinktys. sausas kilimas ()Dabar mes naudosime tretinį operatorių ?= kad užpildytumėte parinkčių, kurias norime turėti specialią numatytąją vertę, reikšmes:
launchNave = (vardas, parinktys = {}) -> options.count? = 10 console.log „# {i}…“, skirtas „i“ [options.count… 0], grąžinkite, jei options.drift sausas kilimas ()Mes apibrėžiame paskutinę vertę ir naudojame operatorių ? jei jis naudojamas vienoje vietoje:
launchSave = (vardas, parinktys = {}) -> checkFuel (options.waitComb? 100) options.count? = 10 console.log „# {i}…“, skirtą „i“, esantį [options.count… 0] return if options. sausas kilimas ()Galiausiai mes naudojame leistiną sintaksę CoffeeScript norėdami nusiųsti parinktis į mūsų funkciją be skliaustų, skambindami mums gana paprastai ir natūraliai:
paleidimo laivas „Millennium Falcon“, „DryGear“: tiesa, atgalinis skaičiavimas: 15Norėdami baigti, mes sudarysime savo failą ir pamatysime savo kodo išvestį „JavaScript“:
DIDELIS