AdityaDees: ecmascript

Hot

https://publishers.chitika.com/

Contact us for advertising.
Showing posts with label ecmascript. Show all posts
Showing posts with label ecmascript. Show all posts

28 March 2020

Goodbye jQuery...

14:06 0


As the web standards becoming more mature each day, my prediction is that the need for third-party JavaScript library such as jQuery will slowly decline. jQuery is indeed still one of the best client-side JavaScript library in my opinion and even I still use it on some of my projects, but as the web application becoming more complex, programmers will starting to look at browser's native solution which will (maybe) offers better performance than the third-party library. In this post i will show you some of the browser's native API for replacing jQuery's DOM selector method, the obvious "$" or "jQuery" function. Under the hood, jQuery is actually using Sizzle library for its DOM selector, which i believe (even though I haven't dig inside the source code) Sizzle also using some of the browser's native API.

DOM selector with document.querySelector(selectors)


As the name already suggests, this method under the Document object fetch the first element within the document that matches the specified selector, or group of selectors. If no matches are found, null is returned. One important thing that we need to know here is that, using this method will return "null" value when no matches were found. For those who familiar with jQuery need to pay attention as the jQuery selector always returns empty Array when no matches were found. Below I show you some example.


<!doctype html>
<html><head><title>Query Selector in JavaScript</title><meta charset="UTF-8"></head>
<body>
<div>This is the first DIV</div>
<div>This is the second DIV</div>
<div>This is the third DIV</div>
<div>This is the fourth DIV</div>
<div>This is the fifth DIV</div>
<script>
// get the first DIV
let firstDiv = document.querySelector('div');
console.log('This is ', firstDiv);

// get the second DIV
let secondDiv = document.querySelector('div:nth-of-type(2)');
console.log('This is the ', secondDiv);
// change the text color to blue
secondDiv.style.color = 'blue';

// get the third DIV
let thirdDiv = document.querySelector('div:nth-of-type(3)');
console.log('This is the ', thirdDiv);
// change the text format to bold
thirdDiv.style.fontWeight = 'bold';

// check if element exists
let sixthDiv = document.querySelector('div:nth-of-type(6)');
if (sixthDiv == null) {
// add the sixth div if it is not exists yet
let newDiv = document.createElement("div")
newDiv.innerText = 'This is the sixth DIV';
document.body.append(newDiv);
}
</script>
</body>
</html>


Tree traversal


querySelector method accepts all type of CSS selector and can be used to do DOM element tree traversal. In fact I already showed one of it the first example using nth-of-type(n) modifier. You can of course use parent children relationship selector also in this case.


<!doctype html>
<html><head><title>Query Selector in JavaScript</title><meta charset="UTF-8"></head>
<body>
<div id="parent">
<div class="child">
<div class="grandchild">
<div class="great_grandchild"></div>
</div>
</div>
<div class="child">
<div class="grandchild"></div>
</div>
</div>
<script>
/* TREE TRAVERSAL */
// get the first direct child under parent
let firstChild = document.querySelector('#parent > .child');
console.log('This is the ', firstChild);

// get the great grandchild under parent
let greatGrandChild = document.querySelector('#parent .great_grandchild');
console.log('This is the ', greatGrandChild);

// alternative syntax to get the great grandchild
greatGrandChild = firstChild.querySelector('.great_grandchild');
console.log('This is the ', greatGrandChild);

// add new first child under parent
let newFirstChild = document.createElement("div");
newFirstChild.innerText = 'The real 1st child';
document.querySelector('#parent').prepend(newFirstChild);

// get the parent of great grandchild
let parentOfGrandChild = greatGrandChild.parentNode;
console.log(parentOfGrandChild);
</script>
</body>
</html>


Multiple DOM element matches and manipulation with querySelectorAll


The querySelectorAll method behaves almost similar with the querySelector, except that it returns not only single match but an array in form of NodeList object instead. You can use this if you want to manipulate more than one element that match with your specified selector. Just remember to add :scope pseudo class at the very first of selector string to make sure the browser only get the child element under the specified element.


<!doctype html>
<html><head><title>Query Selector in JavaScript</title><meta charset="UTF-8"></head>
<body>
<ul id="bio">
<li class="name">The first one</li>
<li class="location">Tsukuba, Japan</li>

<li class="name">The second one</li>
<li class="location">Tokyo, Japan</li>

<li class="name">The third one</li>
<li class="location">Jakarta, Indonesia</li>

<li class="name">The fourth one</li>
<li class="location">Seoul, South Korea</li>

<li class="name">The fifth one</li>
<li class="location">Wuhan, China</li>
</ul>
<script>
/* querySelectorAll */
// get all names
let names = document.querySelectorAll(':scope #bio .name');
console.log('Number of names ', names.length);
console.log('The elements are ', names);

// get all locations
let locations = document.querySelectorAll(':scope #bio .location');
console.log('The elements are ', locations);

// make all location texts italic
locations.forEach(e => e.style.fontStyle = 'italic');

// prepend "name" text inside name element
names.forEach(e => e.prepend('Name: '));

// add empty list element with bottom border after location
// as a data separator
locations.forEach(function(e){
let borderedList = document.createElement('li');
borderedList.style.borderBottom = '1px solid #999';
e.after(borderedList);
});
</script>
</body>
</html>


Pretty neat huh? :D


Sibling manipulation with previousElementSibling and nextElementSibling


It is very often we want to manipulate DOM elements which are positioned on the same level as current selected element, or the siblings of current element. In this case we can use the previousElementSibling and nextElementSibling property.


<!doctype html>
<html><head><title>Query Selector in JavaScript</title><meta charset="UTF-8"></head>
<body>
<div id="friends">
<div class="friend">Harada</div>
<div class="friend">Sasaki</div>
<div class="friend">Iqbal</div>
<div class="friend">Michael</div>
<div class="friend">Megumi</div>
</div>
<script>
/* SIBLINGS */
// get iqbal
let iqbal = document.querySelector('#friends .friend:nth-of-type(3)');
console.log(iqbal);

// who is our friend before iqbal
let beforeIqbal = iqbal.previousElementSibling;
// change the color to orange
beforeIqbal.style.color = 'orange';

// who is our friend after iqbal
let afterIqbal = iqbal.nextElementSibling;
// change the color to purple
afterIqbal.style.color = 'purple';</script>
</body>
</html>
Read More

17 January 2019

Operasi Array dan Object dengan Plain Vanilla Javascript

16:59 0


Dengan semakin matangnya standar JavaScript saat ini berkat hadirnya edisi ke-enam dari standar ECMAScript 2015 dan dukungan berbagai browser modern, pemrograman web dengan Javascript menjadi semakin mudah. Salah satu operasi pemrograman yang sering saya lakukan adalah operasi yang melibatkan Array dan Object (utamanya JSON). Berikut ini adalah beberapa code snippet yang saya coba dokumentasikan yang mungkin bermanfaat bagi teman-teman yang membaca artikel ini. Karena fungsi-fungsi/metode-metode object yang digunakan dalam artikel ini adalah standar, walaupun snippet yang saya contohkan untuk digunakan pada browser (client-side), maka kemungkinan besar snippet kode-kode ini juga bisa berjalan pada NodeJS a.k.a JavaScript di server-side. Karena artikel ini tidak mencakup dasar-dasar pemrograman Javascript, ada baiknya teman-teman yang belum mengenal JavaScript mempelajari terlebih dahulu dasar-dasar pemrograman JavaScript sebelum membaca artikel ini.



Iterasi Array dengan method forEach


Untuk melakukan iterasi terhadap isi dari Array biasanya kita menggunakan loop construct seperti for, alternatifnya kita bisa juga menggunakan forEach yang relatif lebih praktis.


<!doctype html>
<html><head><title>Plain Vanilla JavaScript</title><meta charset="UTF-8"></head>
<body>
<script>
// sebuah Array berisi daftar nama teman-teman
var temanTeman = ['Asri', 'Budi', 'Choirul', 'Deni', 'Erma'];
temanTeman.forEach(function(teman) {
// tampilkan ke console JavaScript
console.log(teman);
// tampilkan pada body dokumen HTML
document.writeln(teman + '<br/>');
});
</script>
</body>
</html>


Iterasi Object dengan method forEach


Untuk melakukan iterasi terhadap property dan nilai yang ada dalam sebuah Object kita bisa juga menggunakan forEach dengan cara sedikit berbeda seperti berikut ini:


<!doctype html>
<html><head><title>Plain Vanilla JavaScript</title><meta charset="UTF-8"></head>
<body>
<script>
var sebuahObject = {nama: 'Ari', pekerjaan: 'Mahasiswa', usia: 36}
Object.keys(sebuahObject).forEach(function(prop) {
// ambil nilai untuk prop ini
const propVar = Object.getOwnPropertyDescriptor(sebuahObject, prop);
// tampilkan pada body dokumen HTML
document.writeln(prop + ': ' + propVar.value + '<br/>');
});
</script>
</body>
</html>


Mencari tahu apakah sebuah nilai ada pada sebuah Array dengan method includes


Untuk mengetahui apakah sebuah nilai ada pada sebuah Array kita bisa menggunakan includes, seperti contoh berikut ini:


<!doctype html>
<html><head><title>Plain Vanilla JavaScript</title><meta charset="UTF-8"></head>
<body>
<script>
// sebuah Array berisi daftar nama teman-teman
var temanTeman = ['Asri', 'Budi', 'Choirul', 'Deni', 'Erma'];
// apakah "Budi" ada dalam daftar-daftar teman-teman kita?
const yangKitaCari = 'Budi'
if (temanTeman.includes(yangKitaCari)) {
// tampilkan ke console JavaScript
console.log(yangKitaCari+' ada dalam daftar!');
// tampilkan pada body dokumen HTML
document.writeln('<p>'+yangKitaCari+' ada dalam daftar!</p>')
} else {
// tampilkan ke console JavaScript
console.log(yangKitaCari+' TIDAK ADA dalam daftar!');
// tampilkan pada body dokumen HTML
document.writeln('<p>'+yangKitaCari+' TIDAK ADA dalam daftar!</p>')
}
</script>
</body>
</html>


Menggabungkan dua atau lebih Array menjadi satu dengan method concat


Kita bisa dengan mudah menggabungkan dua atau lebih Array menjadi satu dengan menggunakan concat, seperti contoh berikut ini:


<!doctype html>
<html><head><title>Plain Vanilla JavaScript</title><meta charset="UTF-8"></head>
<body>
<script>
// menggabungkan dua atau lebih Array menjadi satu
var temanKu = ['Asri', 'Budi', 'Choirul', 'Deni', 'Erma'];
var temanDia = ['Ferry', 'Giri', 'Helmi', 'Iman'];
// gabungkan Array menjadi Array baru
var temanKudanDia = temanKu.concat(temanDia);
console.log(temanKudanDia);
temanKudanDia.forEach(function(teman) {
// tampilkan pada body dokumen HTML
document.writeln(teman + '<br/>');
});
</script>
</body>
</html>


Melakukan filter isi Array berdasarkan kriteria tertentu dengan method filter


Untuk melakukan filter terhadap isi dari Array kita bisa menggunakan filter. Callback dari method filter harus mengembalikan nilai true apabila elemen tersebut ingin dipertahankan dalam Array atau sebaliknya. Bisa dilihat pada contoh berikut ini:


<!doctype html>
<html><head><title>Plain Vanilla JavaScript</title><meta charset="UTF-8"></head>
<body>
<script>
// mem-filter Array sesuai dengan kriteria tertentu
var temanKu = ['Asri', 'Budi', 'Choirul', 'Deni', 'Erma', 'Kampret', 'Kecebong'];
var benarBenarTemanKu = temanKu.filter(teman => teman!='Kampret'&&teman!='Kecebong');
console.log(benarBenarTemanKu);
benarBenarTemanKu.forEach(function(teman) {
// tampilkan pada body dokumen HTML
document.writeln(teman + '<br/>');
});
</script>
</body>
</html>


Mengubah isi Array menjadi Array baru dengan isi yang sudah dimodifikasi dengan method map


Ada kalanya kita ingin memodifikasi/mengubah isi sebuah Array. Hal tersebut bisa dilakukan dengan mudah dengan map:


<!doctype html>
<html><head><title>Plain Vanilla JavaScript</title><meta charset="UTF-8"></head>
<body>
<script>
// membuat Array baru yang isi merupakan hasil modifikasi dari isi Array sebelumnya
var stringTemanKu = ['Asri', 'Budi', 'Choirul', 'Deni', 'Erma'];
// stringTemanKu sebelumnya adalah Array berisi string
// sekarang kita ubah menjadi Array baru berisi object
var objectTemanKu = stringTemanKu.map(teman => {
var objectTeman = {nama: teman, status: 'teman'};
return objectTeman;
});
console.log(objectTemanKu);
// bisa juga sebaliknya, dari Array berisi object menjadi Array berisi string
var stringTemanKuJuga = objectTemanKu.map(teman => teman.nama+' adalah seorang '+teman.status);
console.log(stringTemanKuJuga);
stringTemanKuJuga.forEach(function(teman) {
// tampilkan pada body dokumen HTML
document.writeln(teman + '<br/>');
});
</script>
</body>
</html>


Mengubah string menjadi Array elemennya adalah setiap huruf dari string tersebut dengan function Array.from


Bagaimana apabila kita ingin mengubah sebuah string dan memecahnya menjadi Array yang berisikan setiap huruf dari string tersebut? Mudah!:


<!doctype html>
<html><head><title>Plain Vanilla JavaScript</title><meta charset="UTF-8"></head>
<body>
<script>
// membuat Array dari string
var deretanHuruf = 'ABCDEFGHIJKLM';
var deretanHurufArray = Array.from(deretanHuruf);
deretanHurufArray.forEach(function(huruf) {
// tampilkan pada body dokumen HTML
document.writeln('Ini huruf '+ huruf + '!<br/>');
});
</script>
</body>
</html>


Mengubah Array menjadi string dengan method join


Bagaimana sebaliknya apabila kita ingin mengubah sebuah Array menjadi sebuah string? Mudah!:


<!doctype html>
<html><head><title>Plain Vanilla JavaScript</title><meta charset="UTF-8"></head>
<body>
<script>
// membuat string dari Array
var temanKu = ['Asri', 'Budi', 'Choirul', 'Deni', 'Erma'];
// kita persatukan teman-teman kita dengan sebuah koma
var stringTemanKu = temanKu.join(', ');
// tampilkan pada body dokumen HTML
document.writeln('Teman-temanku adalah: '+ stringTemanKu);
</script>
</body>
</html>


Melakukan tes pada setiap isi Array apakah sudah memenuhi kriteria dengan method every


Adakalanya kita ingin mengetahui apakah setiap anggota dari Array sudah memenuhi kriteria tertentu, untuk melakukan tes tersebut kita bisa menggunakan every:


<!doctype html>
<html><head><title>Plain Vanilla JavaScript</title><meta charset="UTF-8"></head>
<body>
<script>
// melakukan tes pada setiap elemen Array apakah memenuhi kriteria tertentu
var anggota = [
{nama: 'Asri', usia: 17},
{nama: 'Budi', usia: 18},
{nama: 'Choirul', usia: 19},
{nama: 'Deni', usia: 20},
{nama: 'Erma', usia: 15}
];
// apakah semua orang dalam anggota sudah lebih dari 16 tahun?
var semuaSudahDewasa = anggota.every(orang => orang.usia>16);
if (semuaSudahDewasa) {
document.writeln('Semua sudah dewasa!');
} else {
document.writeln('Masih ada di antara mereka yang belum dewasa!');
}
</script>
</body>
</html>


Semoga artikel ini bermanfaat, apabila ada pertanyaan terkait dengan beberapa fungsi dasar dari JavaScript bisa teman-teman tanyakan pada kolom komentar.

Read More

01 January 2018

Promise : Sebuah Janji Eksekusi dari Javascript

22:31 0


Judul artikel ini mungkin agak sedikit bombastis: "Promise : Sebuah Janji Eksekusi dari Javascript". Promise adalah sebuah mekanisme dari standar ECMAScript 2015 yang memungkinkan kita melakukan eksekusi kode fungsi Javascript asynchronous (salah satunya adalah request AJAX) dan mendapatkan nilai balik (return value) dari eksekusi kode tersebut tidak secara langsung, melainkan berupa objek "Promise" yang menjanjikan eksekusi di masa yang akan datang! Paham? Tidak? kalau teman-teman pembaca tidak paham itu wajar, saya juga awalnya bingung kenapa pula ini ada fitur di bahasa pemrograman pake "janji-janji" segala!? Mari kita tengok definisi dari Promise yang saya kutip dari dokumentasi Mozilla Developer Network :



A Promise is a proxy for a value not necessarily known when the promise is created. It allows you to associate handlers with an asynchronous action's eventual success value or failure reason. This lets asynchronous methods return values like synchronous methods: instead of immediately returning the final value, the asynchronous method returns a promise to supply the value at some point in the future.


Masih belum mudeng? sama saya juga hahaha🤣🤣🤣! Kalau begitu mari kita lihat contoh kode HTML dan Javascript sebagai berikut sebagai berikut:



promise.html


<!doctype html>
<html>
<head><title>Promise</title><meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script>
var datauser = [];
// fungsi untuk melakukan request AJAX
function getUsers(url) {
$.ajax({
url: url,
method: 'get'
}).done(function(hasil) {
// isi variabel global datauser dengan hasil dari AJAX
datauser = hasil;
});
}
// fungsi untuk mengubah data JSON ke list HTML
function ubahDataKeHTML(datauser) {
var html = '<ul>';
$.each( datauser, function( key, value ) {
html += '<li>'+value.name+' - '+value.email+'</li>'
});
html += '</ul>';
return html;
}
// panggil fungsi 'getUsers'
getUsers('https://jsonplaceholder.typicode.com/users');
// ubah data dari hasil AJAX ke list HTML
var datauserHTML = ubahDataKeHTML(datauser);
// tampilkan isi variabel ke log
console.log(datauser);
console.log(datauserHTML);
// tampilkan data user
$(document).ready(function() {
$('.container').html(datauserHTML);
});
</script>
</head>
<body>
<div class="container"></div>
</body>
</html>


Hasil yang muncul adalah sebagai berikut:





Apa yang terjadi? ternyata tidak sesuai apa yang kita harapkan! tag div kita tidak terisi dengan list data user seperti yang kita mau, dan juga ternyata variabel array datauser tidak terisi dengan data padahal tidak ada yang salah dengan kode ini, semua berjalan dengan baik. saya yakin banyak dari teman-teman web programmer yang pernah mengalami hal ini dan garuk-garuk kepala, lalu browsing cari jawaban di Stackoverflow kan? hehehe :D.

Loh mas ngapain ribet, heeellllooowwww?? ubah aja kode-nya, misalnya lakukan eksekusi fungsi ubahDataKeHTML ke dalam fungsi .done dari objek $.ajax()? atau ngapain juga bikin fungsi-fungsi segala?


Hehehe, silahkan saja dicoba, paling nanti ada saatnya kepentok lagi hehehe 😬😬😬. Kegagalan kode di atas terjadi karena eksekusi kode $.ajax dan .done berjalan secara asynchronous/paralel dan tidak terjadi secara berurutan sehingga variabel global datauser mungkin belum terisi dengan hasil dari request AJAX karena request AJAX belum selesai. Penyebab lain adalah karena Javascript hanya bisa mengakses variabel global satu tingkat di atas cakupan fungsi, dalam hal kode di atas variabel datauser berarti dua tingkat di atas cakupan fungsi .done. Cara yang elegan untuk masalah ini adalah dengan menggunakan Promise yang sudah menjadi standar default sejak spesifikasi ECMAScript 2015 atau serin disingkat ES2015. Berikut adalah kode Javascript yang sudah kita ubah dengan memanfaatkan Promise:



promise1.html


<!doctype html>
<html>
<head><title>Promise</title><meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script>
// fungsi untuk melakukan request AJAX dan mengembalikan objek Promise
function getUsers(url) {
return new Promise(function(resolve, reject) {
$.ajax({
url: url,
method: 'get'
}).done(function(hasil) {
// simpan hasil dari AJAX ke callback 'resolve' dari Promise
// untuk kemudian nanti dipakai oleh fungsi '.then'
resolve(hasil);
});
})
}
// fungsi untuk mengubah data JSON ke list HTML
function ubahDataKeHTML(datauser) {
var html = '<ul>';
$.each( datauser, function( key, value ) {
html += '<li>'+value.name+' - '+value.email+'</li>'
});
html += '</ul>';
return html;
}
// panggil fungsi 'getUsers' dan jalankan fungsi '.then'
// argumen dari fungsi '.then' adalah sebuah callback dengan argumen 'hasil'
// yang berisikan objek JSON hasil AJAX
getUsers('https://jsonplaceholder.typicode.com/users').then(function(hasil) {
console.log(hasil);
console.log('Janji telah dipenuhi!');
var datauserHTML = ubahDataKeHTML(hasil);
// tampilkan data user
$(document).ready(function() {
$('.container').html(datauserHTML);
});
});
</script>
</head>
<body>
<div class="container"></div>
</body>
</html>


Dengan kode ini kita akan melihat hasil seperti berikut ini:





Penjelasan sederhana dari kode ini adalah, ketika kita menggunakan Promise, maka kita menggunakan callback resolve untuk menyimpan hasil dari request AJAX kita, yang kemudian hasil ini akan tersedia pada argumen callback fungsi .then untuk selanjutnya diolah dan dijadikan HTML oleh fungsi ubahDataKeHTML.



Chaining


Salah satu kelebihan dari Promise adalah memungkinkan terjadinya chaining atau eksekusi Promise berantai, fitur ini berguna ketika kita ingin melakukan eksekusi kode secara berantai dimana eksekusi kode dilakukan benar-benar setelah eksekusi kode sebelumnya sudah selesai atau terpenuhi, seperti bisa kita lihat pada kode berikut:



promise2.html


<!doctype html>
<html>
<head><title>Promise</title><meta charset="UTF-8">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script>
// fungsi untuk melakukan request AJAX dan mengembalikan objek Promise
function getUsers(url) {
return new Promise(function(resolve, reject) {
$.ajax({
url: url,
method: 'get'
}).done(function(hasil) {
// simpan hasil dari AJAX ke callback 'resolve' dari Promise
// untuk kemudian nanti dipakai oleh fungsi '.then'
resolve(hasil);
}).fail(function() {
reject('Error pada request AJAX!');
});
})
}
// fungsi untuk mengubah data JSON ke list dan tabel HTML
function ubahDataKeHTML(datauser) {
console.log('Janji pertama (request AJAX) telah dipenuhi');
var list = '<h3>Data users dalam format list</h3>';
list += '<ul>';
var tabel = '<h3>Data users dalam format tabel</h3>';
tabel += '<table class="table table-bordered">';
$.each( datauser, function( key, value ) {
list += '<li>'+value.name+' - '+value.email+'</li>'
tabel += '<tr><td>'+value.name+'</td><td>'+value.email+'</td></tr>'
});
list += '</ul>';
tabel += '</table>';
return {htmlList: list, htmlTable: tabel};
}
// fungsi untuk menginject HTML ke dalam div .container
function injectHTML(html) {
console.log('Janji kedua (ubah JSON ke HTML) telah dipenuhi');
return $('.container').append(html.htmlList).append(html.htmlTable);
}
// fungsi untuk menampilkan log pada console
function terakhir(objJquery) {
console.log('Janji terakhir (inject HTML ke .container) telah dipenuhi');
console.log('Berikut objek jQuery dari nilai balik callback Janji (Promise) sebelumnya:');
console.log(objJquery);
}

// setiap kali '.then' dipanggil maka akan mengembalikan objek Promise
// dan nilai balik dari callback bisa diakses pada callback berikutnya
// yang bisa kita 'chain' tanpa batas
// fungsi '.catch' menangkap hasil dari callback 'reject' yang apabila terjadi
// maka Promise tidak bisa terpenuhi
getUsers('https://jsonplaceholder.typicode.com/users')
.then(hasil => ubahDataKeHTML(hasil))
.then(html => injectHTML(html))
.then(objJquery => terakhir(objJquery))
.catch(error => {
console.log(error);
$('.container').html('<div class="alert alert-danger">Data users gagal diambil disebabkan oleh : '+error+'</div>');
});
</script>
</head>
<body>
<div class="container"></div>
</body>
</html>


Kita akan melihat hasil sebagai berikut untuk kode di atas:





Syntax alternatif untuk chaining Promise menggunakan standar ES2017 adalah dengan menggunakan async/await seperti berikut ini:



promise3.html


<script>
...

// alternatif chaining dengan menggunakan 'async/await'
async function ambilUserDanTampilkan(url) {
try {
let hasil = await getUsers(url);
let html = await ubahDataKeHTML(hasil);
let objJquery = await injectHTML(html);
terakhir(objJquery);
} catch(error) {
console.log(error);
$('.container').html('<div class="alert alert-danger">Data users gagal diambil disebabkan oleh : '+error+'</div>');
}
}
// jalankan fungsi async
ambilUserDanTampilkan('https://jsonplaceholder.typicode.com/users');

</script>


Promise.all


Ada kalanya dalam membangun aplikasi web interaktif dengan Javascript kita ingin suatu kode dieksekusi ketika semua persyaratan (eksekusi kode lain) sudah terpenuhi, tanpa memperdulikan urutan selesai-nya persyaratannya tersebut. Misalnya kita melakukan request AJAX ke banyak sumber yang berbeda dan setelah semua request AJAX selesai kita akan mengeksekusi kode terakhir yang menampilkan kotak alert menandakan bahwa semua request tersebut telah selesai, maka kita bisa menggunakan metode Promise.all dalam hal ini. Mari kita ilustrasikan dengan kode berikut ini:



promise-all.html


<!doctype html>
<html>
<head><title>Promise</title><meta charset="UTF-8">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script>

function autentikasiUser(url, username, password) {
return new Promise(function(resolve, reject) {
// lakukan request AJAX
// kita umpamakan berhasil dan selesai dalam waktu 1,5 detik
setTimeout(function(){
resolve("Autentikasi user berhasil!"); console.log('Autentikasi berhasil'); }, 1500);
});
}

function ambilDataBerita(url) {
return new Promise(function(resolve, reject) {
// lakukan request AJAX
// kita umpamakan berhasil dan selesai dalam waktu 2,5 detik
setTimeout(function(){
resolve('berita terbaru berhasil diambil'); console.log('Berita berhasil diambil'); }, 2500);
});
}

function ambilDataCuaca(url) {
return new Promise(function(resolve, reject) {
// lakukan request AJAX
// kita umpamakan berhasil dan selesai dalam waktu 3,5 detik
setTimeout(function(){
resolve('Data cuaca berhasil diambil'); console.log('Cuaca berhasil diambil'); }, 3500);
});
}

let c = ambilDataCuaca('http://servercuaca.com');
let a = autentikasiUser('http://serverautentikasi.com', 'dicarve', 'rahasia');
let b = ambilDataBerita('http://serverberita.com');

let pAll = Promise.all([c, b, a]).then(hasil => {
console.log('Semua Promise (Janji) telah terpenuhi');
$('.container .alert').removeClass('alert-info').addClass('alert-success').html('Semua data berhasil diambil dari server!');
}, error => {
console.log('Terjadi error karena salah satu Promise tidak bisa terpenuhi!')
$('.container .alert').removeClass('alert-info').addClass('alert-danger').html('Error disebabkan oleh: '+error);
});

</script>
</head>
<body>
<div class="container"><div class="alert alert-info">Loading data...</div></div>
</body>
</html>


Ketika kita menggunakan Promise.all, argumen yang digunakan harus berupa Array yang mengandung semua fungsi Promise yang kita eksekusi. Apabila semua fungsi Promise ini berhasil dan terpenuhi (resolve), maka kode di dalam callback pertama fungsi .then akan dieksekusi. Sedangkan apabila salah satu saja gagal alias reject, maka callback kedua akan dijalankan dan pesan error akan muncul. Bagaimana? menarik bukan? sekali kita paham akan pemanfaatan Promise maka kemungkinan besar kita akan banyak memanfaatkannya untuk menuliskan kode yang lebih elegan untuk operasi-operasi asynchronous di kode Javascript kita. Selamat mencoba!

Read More

https://payclick.com/

Contact us for advertising.