Практикийн ажил

Хичээлээр RxJs сангийн талаар өмнөх хичээлүүдээр олон авсан мэдлэгээ бататган API контактад хандан хэрэглэгчийн мэдээллийг авах энгийн програмыг боловсруулах болно. Програмаас төрөл бүрийн хүсэлтийг илгээх боломжтой болгох зорилгоор төсөлдөө Jquery санг суулгая. Үүний тулд WebStorm текст засварлагчийн терминалыг нээгээд

npm i jquery командыг өгөөрэй.

Санг та өөрийн мэдэх дурын аргаар суулгаж болно. Би WebStorm текст засварлагчийн терминалаас npm програмыг ашиглан суулгалаа. Jquery санг ашиглахын тулд түүнийг index.html файлд

гэж оруулан ирэх хэрэгтэй. Үүнээс гадна манай програмын үндсэн дэлгэцийн суурийг index.html файлд

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<input type="text">
<h1></h1>
<img src="">

<script src="node_modules/rxjs/bundles/Rx.min.js"></script>
<script src="node_modules/jquery/dist/jquery.min.js"></script>
<script src="index.js"></script>
</body>
</html>

кодийг оруулан өгье. index.html файлд ямар нэгэн хэрэглэгчийн ID -г оруулах input талбар, хоосон h1 гарчиг, зургийн img тегийг нэмэн оруулсан. Програмын үндсэн ажиллагааны кодууд index.js файлд байрлах юм.
Бэлтгэл ажлыг хийсэн болохоор index.js файлдаа програмын үндсэн кодоо бичиж эхлэе. Эхлээд алслагдсан серверт хүсэлт илгээх

function getUserById(id) {
    const params = {
        v: '',
        access_token: '',
        user_ids: id
    };

    return $.ajax({
        url: '' + $.param(params),
        type: 'GET',
        dataType: 'JSONP'
    }).promise();
}

getUserById функцийг нэмэн оруулъя. Функц хэрэглэгчийн ID -г аваад серверт илгээх параметрийн обьектыг бүрдүүлэх ёстой. Контактын API -д хандахын тулд эхний ээлжинд бидэнд токен хэрэгтэй тул access_token, user_ids талбаруудыг үүсгэнэ. Үүнээс гадна обьектод контакт API -гийн хувилбарын v гэсэн талбарыг үүсгэсэн байгаа. user_ids талбарт функцэд ирсэн утгыг олгосон. Энэ утгыг index.html -ийн input талбараар дамжуулан авах юм. Параметрийн обьектыг үүсгээд түүнийг ajax хүсэлтэд дамжуулан серверт илгээгээд RxJs сангийн хэрэгслүүдийг ашиглахын тулд хариуг промис хэлбэрээр буцаах юм. ajax хүсэлт заавал байх ёстой url, type, dataType талбаруудтай обьектыг авна. url -ийг одоохондоо хоосон орхиё. Хүсэлтийн төрөл typeGET харин өгөгдлийн төрөл dataType талбарт JSONP протоколыг заасан. Параметрийн обьектыг GET хүсэлтийн мөрөнд ' '+$.param(params) гэж нэмэн оруулна. Серверд холбогдох суурь функц бэлэн болсон.
Хүсэлтийг контактын API хүлээн авч боловсруулалт хийн хариу авахын тулд функцийн ажиллагаанд шаардлагатай мэдээллүүд болох access_token, url -д утга хэрэгтэй. Үүний тулд хөтөчийн хаягийн мөрөнд vk.com/dev хаягийг бичээд Enter дарахад

дээрх цонх нээгдэнэ. Цааш My apps цэс дээр дарахад

нээгдэх цонхноос Create application цэсийг сонгоно.

Санамж: Та vk.com/dev сайтад бүртгүүлсэн байх ёстойг анхааруулъя. Бүртгэлтэй бол өөрийн мэдээллээ ашиглан нэвтэрсэн байх ёстой. Хэрвээ бүртгэлгүй эхлээд бүртгүүлэх хэрэгтэй. Бүртгүүлэх ажиллагаа бусад сайтын бүртгэлтэй ижил стандарт тул энд тайлбарлах нь илүүц.

Create application цонхны талбаруудад дээрх сонголтыг хийгээд Connect Application товчийг дарна. Title талбарт та хүссэн нэрээ өгч болно. Програм токеноор ажиллах тул Platform талбарт Standalone Application -г сонгоорой. Connect Application товчийг дарахад баталгаажуулалтын код авах утасны дугаарыг асууна. Та бүртгэл хийлгэхдээ утасны дугаараа оруулсан бол өөрийн номертоо баталгаажуулах кодыг аваад

Confirmation code талбарт оруулан өгөөд баталгаажуулахад

шинээр үүсгэсэн програмын удирдах хэсэгт шилжих ба Settings цэсээр ороход

зурагт үзүүлсэн цонх нээгдэнэ. Тохиргоо цонхны Application status талбарт програмыг идэвхижүүлэн хадгалаад. Application Id талбарын утгыг хуулан аваад хадгалаарай. Дараа нь програмын тохиргоо хэсгийн Documentation цэсээр орон

API versions дэд цэсээр хувилбарын дугаарыг тэмдэглэн аваарай. Энэ дугаарыг параметрийн обьектын v талбарт өгнө. Цааш Documentation цэсээс

Learning API дэд сонголтыг хийхэд гарч ирэх Learning API хуудасны User authorization хэсэгт шилжинэ.

User authorization хэсэг дэх ногоон хүрээгээр тэмдэглэсэн хаягийг олон хуулан аваад хөтөч дээр шинэ Tab нээгээд  хаягийн мөрөнд холбоосыг тавин өгөөд зурагт үзүүлсний дагуу

өөрчлөн өгнө. Өөрчлөлтийг хийхдээ client_id= -гийн араас өөрийн Application Id -г тавин өгөхийг сануулъя. Хаягийн мөрөнд өөрчлөлт оруулаад Enter даран хуудаст шилжээд програм таны аккаунтад хандахыг зөвшөөрлийг /Allow/ өгөхөд нээгдэх хуудасны

хаяг таны access_tokenaccess_token=xxxxxxxxxxxxxx хэлбэрээр агуулсан байна. Хуудаст хаягийн мөрний өгөгдлүүдийг гадны сайтад өгвөл та өөрийн аккаунтын хандалтыг алдаж болохыг анхааруулсан байгаа. Хаягийн мөрөөс access_token талбарын утгыг хуулан аваад кодын

function getUserById(id) {
    const params = {
        v: '5.85',
        access_token: 'ff68e28dffc6691a5db5a9d7e37d09a0744321e222e134adf7236c75cf208a3e47c3d51ccda98e71eaafa',
        user_ids: id,
        fields: 'photo_big'
    };
   ...

access_token талбарын утгаар өгөөрэй. Обьектод v: '5.85' гэж контакт API -гийн хувилбарыг заан өгөөрэй.    
Серверт ямар хаягаар хүсэлтийг илгээхийг мэдэхийн тулд дахин Documentation -> Learning API -> User authorization гэж шилжээд

дээрх зурагт үзүүлсэн хүсэлтийн хаягийн жишээг олон хуулан аваад кодын ajax хүсэлтийн url талбарт тавиад

return $.ajax({
    url: 'https://api.vk.com/method/' + $.param(params),
    type: 'GET',
    dataType: 'JSONP'
}).promise();

дээрх байдлаар өөрчлөөрэй. Хүсэлт илгээх хаягийг мэдсэн. Манай програм API контактад хандан хэрэглэгчийн мэдээллийг авах учраас API контакт бидэнд ямар аргуудыг өгч байгааг мэдэх хэрэгтэй. Үүнийг програмын тохиргоо хэсгийн Documentation цэсээр ороод

API methods дэд цэсний Users хэсгээс мэднэ. Users хэсгийн get аргыг нээхэд

аргын нэр users.get гэдэг нь харагдана. Энэ аргыг ajax хүсэлтийн хаягийн утганд нэмэн өгвөл getUserById функцийн код

function getUserById(id) {
    const params = {
        v: '5.85',
        access_token: 'ff68e28dffc6691a5db5a9d7e37d09a0744321e222e134adf7236c75cf208a3e47c3d51ccda98e71eaafa',
        user_ids: id
    };

    return $.ajax({
        url: 'https://api.vk.com/method/users.get?' + $.param(params),
        type: 'GET',
        dataType: 'JSONP'
    }).promise();
}

болно. Ингээд хүсэлт илгээх функц бэлэн болсон. Бид index.html файлд img тагийг оруулан хэрэглэгчийн зургийг үзүүлэхээр төлөвлөсөн учраас Documentation -> API methods -> Users ->  get гэж users.get аргын хуудаст шилжин аргын параметрүүдийг харвал тэнд fields гэсэн талбар байгаа. Иймээс параметрийн обьектод fields нэмэн оруулбал функцийн код

function getUserById(id) {
    const params = {
        v: '5.85',
        access_token: 'ff68e28dffc6691a5db5a9d7e37d09a0744321e222e134adf7236c75cf208a3e47c3d51ccda98e71eaafa',
        user_ids: id,
        fields: 'photo_big'
    };

    return $.ajax({
        url: 'https://api.vk.com/method/users.get?' + $.param(params),
        type: 'GET',
        dataType: 'JSONP'
    }).promise();
}

болно. users.get аргын fields параметрийн утгаар олон талбаруудыг өгч болох ч бидэнд хэрэглэгчийн зураг хэрэгтэй тул photo_big гэж өгсөн. Контактын API -д хандан хэрэглэгчийн мэдээллийг аван промисээр буцаах функц бэлэн болсон болохоор ирсэн мэдээллийг RxJs сангаар боловсруулах

Rx.Observable.fromEvent($('input'), 'keyup')
    .pluck('target', 'value')
    .distinct()
    .debounceTime(2000)
    .mergeMap(y => Rx.Observable.fromPromise(getUserById(y)))
    .catch(error => Rx.Observable.of(error))
    .subscribe(x => {
        console.log(x);
    });

кодыг бичье. RxJs сангийн хичээлүүдийг сайн судлан ойлгосон бол кодын ажиллагааг ойлгоход төвөггүй ч хэрхэн ажиллах тайлбарыг хийе. Хэрэглэгчийн ID -г авах талбарыг index.html файлд input -ээр оруулан өгсөн байгаа учраас түүнийг боловсруулахын тулд бид үйл явцаас стримийг Rx сангийн Observable классын fromEvent аргаар Rx.Observable.fromEvent($('input'), 'keyup') үүсгэнэ. Аргын эхний параметрээр DOM -ийн элементийг jquery -гээр $('input') гэж өгсөн ба боловсруулалт хийх үйл явц keyup буюу товчны даралтыг зогсоох юм. Дараа нь input -д оруулсан утгыг pluck аргаар pluck('target', 'value') авна. Параметрүүд бол target талбарын value талбарын утгыг авахыг заана. Утгыг авсан болохоор шалгалтууд хийх хэрэгтэй. Эхнийх нь input -ийн утга өөрчлөгдөөгүй бол илүү хүсэлтийг илгээхгүй байх үүднээс distinct() функцийг дуудна. Энгийнээр хэлбэл сум бүхий товч дарахаас хамгаалж байгаа хэрэг. Дараа нь контактын API -д тасралтгүй хандалт хийхийг debounceTime функцээр хязгаарлана. Програм хүсэлт хооронд 2 секунд хүлээн гэсэн үг. Тэгэхгүй бол контактын API бидний хандалтад блок тавина. input -ийн утга хязгаарлалтыг даван гаран ирэхэд хүсэлтийг илгээх хэрэгтэй. Энд бид стримд бүртгүүлээд тэндээс шинэ стримийг илгээж болох ч илүү сайн арга бол mergeMap -ийг ашиглах. Арга стримийн тухайн үеийн утгыг аваад Rx сангийн Observable классын fromPromise аргаар getUserById функцээс буцаах промисээс стримийг үүсгэх эргэн дуудалтын /call back/ функцийг дуудна. getUserById функц mergeMap аргад ирэх стримийн утга буюу input -д оруулсан хэрэглэгчийн ID -г авна. Сервер ямар нэгэн байдлаар хариу өгөхгүй алдаа гарвал түүнийг catch аргаар барин боловсруулалтыг хийнэ. Эцэст нь mergeMap арга үүсгэх стримд subscribe аргаар бүртгүүлээд серверээс ирсэн хариуг консолд харуулна. Одоо index.html файлаа хөтөч дээр нээгээд input -д ямар нэгэн ID -г оруулбал консолд

дээрх хариуг авах болно. Серверээс оруулсан ID -д тохирох хэрэглэгчийн мэдээллийг буцаасан нь үр дүнгээс харагдана. Бид контактын API -д хандан ID нь 1 тэй тэнцүү хэрэглэгчийн мэдээллийг татан авч чадлаа. Серверээс өгөгдөл response нэртэй массивт ирж буйг мэдсэн тул түүнийг боловсруулах боломжтой болсон тул кодод

Rx.Observable.fromEvent($('input'), 'keyup')
    .pluck('target', 'value')
    .distinct()
    .debounceTime(2000)
    .mergeMap(y => Rx.Observable.fromPromise(getUserById(y)))
    .catch(error => Rx.Observable.of(error))
    .map(x => x.response[0])
    .subscribe(
        (user) => {
            $('h1').html(`${user.first_name} ${user.last_name} <i>${user.id}</i>`);
            $('img').attr('src', user.photo_big);
        },
        error => console.log(error),
        () => console.log('Completed')
    );

өөрчлөлтийг оруулъя. Серверээс ирсэн промисийг map аргад өгөөд түүнээс response[0] -ийг буцаая. Ингэснээр subscribe аргад серверээс ирсэн хэрэглэгчийн мэдээлэлтэй шууд ажиллах боломжтой болно. subscribe аргын эргэн дуудалтын /call back/ эхний арга user параметрийг авна. Энэ параметрээр серверээс авсан мэдээллийн response массивын эхний элемент ирнэ. Дараагийн аргаар хэрвээ алдаа гарвал түүнийг консолд үзүүлнэ. Сүүлийн эргэн дуудалт бол стрим дууссанг илэрхийлнэ. Стрим утга хэвийн тараахад эхний эргэн дуудалт ажиллана. Иймээс энэ аргад index.html файлд нэмсэн h1, img тегүүдэд серверээс ирсэн хариунаас утгуудыг тавин өгсөн. $('h1') гэж jquery-гээр тегийг аваад түүний кодыг html аргаар өөрчилнө. Кодыг өөрчлөхдөө `${user.first_name} ${user.last_name} <i>${user.id}</i>` гэж ES6 -гийн стандарт аргыг ашигласан. $('img').attr('src', user.photo_big); бичлэг бол img тегийг аваад түүний src атрибутын утгыг user.photo_big -ээр сольж байгаа. Утгуудыг серверийн хариуны response массивын талбаруудаас авч байгааг сануулъя. Хөтөч дээр хуудсаа шинэчлээд input

ямар нэгэн утга өгвөл тохирох хэрэглэгчийн мэдээллийг програм харуулна. input -д өөр ID -г өгвөл өөр хэрэглэгчийн мэдээллийг авах болно. Туршаад үзээрэй.
Програм яг зөв мэдээлэл татан ирж байгааг шалгахын тулд өөрийхөө ID -г өгөн шалган үзье. Өөрийн ID -г мэдэхийн тулд https://vk.com/dev хаягт хандан өөрийн логиноор нэвтрээд

зураг дээрээ дарахад нээгдэх

хуудасны id -гийн арын тоонуудыг хуулж аваад програмын input -д өгвөл

контакт дахь миний мэдээллийг буцаана. Та өөрийн id -г өгөөд шалгаад үзээрэй. Хуудсны Network табыг нээгээд

улаан дугуй хүрээтэй товчийг даран цэвэрлээд input -ийн талбарт сумтай товчийг дараад 2 секунд хүлээхэд ямарч хүсэлт явахгүй. Яагаад гэвэл кодод distinct аргаар энэ үйлдлээс хамгаалалт хийгдсэн.

Мэдээлэл таалагдсан бол найзуудтайгаа хуваалцаарай.

  Нээгдсэн тоо: 1302 Төлбөртэй

Хөтөч дээр ажилладаг интернетэд сууриласан програмын боловсруулалт хийхэд javascript хэлийг ашиглах шаардлага зүй ёсоор гарч ирдэг. Иймээс хөтөчүүд ойлгон ажилладаг энэхүү хэлийг програм зохиогчид заавал мэдэж байх хэрэгтэй. Энэ удаад ES6 -д мөрүүдтэй ажиллаха ажиллагаанд орсон өөрчлөлтүүд тэдгээртэй ажиллах ажиллагаа хир хөнгөн болсонг үзье. Эхлээд мөрүүдийг хооронд нь холбох тохиолдолыг авч үзье. Бидэнд

let name = 'e-surgalt.com';
let str = 'Манай сайтад зочилсонд танд баярлалаа!';

хоёр мөр байлаа гэе. str хувьсагчид name хувьсагчийг оруулан шинэ мөрийг гаргахын тулд өмнө нь холболтын операторыг

let name = 'e-surgalt.com';
let str = 'Манай ' + name + ' сайтад зочилсонд танд баярлалаа!';
console.log(str);

гэж ашигладаг байсан.

  Нээгдсэн тоо: 2312 Төлбөртэй

Хаана ямар үйл явдал болсон талаарх дэлгэрэнгүй мэдээллийг Event обьект агуулж байдаг. Харамсалтай нь энд олон тооны хөтөч хоорондын зөрчил байдаг ч хамгийн чухал хэсгүүдийг зохицуулан ашиглах боломжтой.

Үйл явдлын төрөл

Үйл явдлын төрлийг Event обьектын type шинжээр мэдэж болно. Доорх кодод боловсруулагч onclick ба onmouseout үйл явдал үүсэхэд төрлийг тодорхойлж байгаа юм. Энэ бол хөтөч хоорондын зөрчлийг арилгасан шийдэл.

  Нээгдсэн тоо: 880 Төлбөртэй

Хичээлээр Promise ухагдхууны тухай жишээгээр авч үзье. Эхлээд Promise гэж юу болох юунд ашигладагийн тухайд гэвэл. ES6 - д Promise гэдэг нь синхрон буюу зэрэг биелэгдэх кодтой ажиллах механизм юм. Үүнийг ойлгохын тулд хүлээлт үүсгэх функцийг эхлээд ES5 - аар хэрэгжүүлсэн

function oldDelay(ms, func) {
    setTimeout(function () {
        func();
    }, ms);
}

oldDelay(3000, function () {
    console.log('Old delay passed!');
});

кодыг харцгаая. oldDelay функц эхний ms параметрээр хүлээлт үүсгэх хугацааг харин хоёрдахь func параметрээр хүлээлтийн хугацаа дуусахад дуудагдах функцийг авна. Хүлээлтийг setTimeout функцээр үүсгэх бөгөөд функц эхний параметрээр эргэн дуудалтын /callback/ функц харин хоёрдахь параметрээр хүлээлтийн хугацааг авдаг. setTimeout функцийн хоёрдахь параметр буюу хүлээлтийн хугацаанд oldDelay функцэд ирэх ms параметрийг өгөөд энэ хугацаа өнгөрөхөд ажиллах эргэн дуудалтын функцээс oldDelay функцэд параметрээр ирсэн func функцийг дуудна.

  Нээгдсэн тоо: 428 Төлбөртэй

Төсөлд react-router-dom санг оруулан чиглүүлэгчдийг бүртгүүлэн тохируулсан Санг суулган тохируулах хичээлээр бид хуудас хооронд динамик буюу дахин ачаалахгүйгээр шилжилт хийх боломжийг бүрдүүлсэн. App компонентийн кодод бүртгүүлсэн

function App() {
  return (
    <div>
      <nav className="nav">
        <ul>
          <li>
            <Link to="/">Нүүр</Link>
          </li>
          <li>
            <Link to="/about">About</Link>
          </li>
        </ul>
      </nav>

      <hr />
      <Routes>
        <Route path="/" element={<Cars />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </div>
  );
}

export default App;

/ чиглүүлэгч манай нүүр хуудас буюу http://localhost:3000/ хаягийг зааж байгаа ч Cars компонентод шилжиж байгаа нь логикийн талаасаа ойлгомж муутай болсон. Иймээс кодийг / чиглүүлэгчээр нүүр хуудаст шилждэг болгоё.

Үйл явдал /event/ тодорхой үйлдэл хийгдсэн талаар системд мэдэгддэг. Хэрвээ бид энэхүү үйлдлийг ажиглах хэрэгтэй бол яг энд…

Нээгдсэн тоо : 108

 

Манай төсөл олон хуудсуудтай болон тэдгээрийн хооронд динамикаар шилжилт хийж байгаа ч тухайн үед шилжилт хийгдсэн хуудаст тохирох…

Нээгдсэн тоо : 170

 

Зочин (Visitor) паттерн классуудыг өөрчлөхгүйгээр тэдгээрийн обьектуудын үйлдлийг тодорхойлох боломжийг олгоно. Зочин хэвийг ашиглахдаа классуудын хоёр ангилалыг тодорхойлно.…

Нээгдсэн тоо : 139

 

Лямбда-илэрхийлэл нь нэргүй аргын хураангуй бичилтийг илэрхийлнэ. Лямбда-илэрхийлэл утга буцаадаг, буцаасан утгыг өөр аргын…

Нээгдсэн тоо : 260

 

Кодийн сайжруулалт /рефакторинг/ хичээлээр програмийн кодоо react -ийн зарчимд нийцүүлэн компонентод салгасан.…

Нээгдсэн тоо : 292

 

Хадгалагч (Memento) хэв обьектын дотоод төлвийг түүний гадна гаргаж дараа нь хайрцаглалтын зарчмыг зөрчихгүйгээр обьектыг сэргээх боломжийг олгодог.

Нээгдсэн тоо : 303

 

Делегаттай нэргүй арга нягт холбоотой. Нэргүй аргуудыг делегатийн хувийг үүсгэхэд ашигладаг.
Нэргүй аргуудын тодорхойлолт delegate түлхүүр үгээр…

Нээгдсэн тоо : 360

 

Математикт харилцан урвуу тоонууд гэж бий. Ямар нэгэн тооны урвуу тоог олохдоо тухайн тоог сөрөг нэг зэрэг дэвшүүлээд…

Нээгдсэн тоо : 347

 

Төсөлд react-router-dom санг оруулан чиглүүлэгчдийг бүртгүүлэн тохируулсан Санг суулган тохируулах хичээлээр бид хуудас…

Нээгдсэн тоо : 428

 
Энэ долоо хоногт

тэгшитгэлийг бод.

Нээгдсэн тоо : 565

 

тэнцэтгэл бишийг бод.

Нээгдсэн тоо : 1019

 

Хоёр тамирчин тойрог замаар нэгэн зэрэг гарч 3,2 км замыг туулан барианд оржээ. Тойргийг нэг тамирчин нөгөөгөөсөө 10 секундээр хурдан тойрдог. Ялагч барианд орж байхад нөгөө нь бүтэн тойрог гүйх үлдсэн байлаа. Ялагч замыг 9 мин 20 секундэд туулсан бол тойрог замын уртыг ол. Тамирчдын хурдыг тогтмол гэж үзнэ.

Нээгдсэн тоо : 519