Bagaimana kode Javascript menjadi tidak sinkron saat menggunakan panggilan balik?

26

Saya telah melakukan banyak membaca online mencoba mencari cara menulis kode JavaScript asinkron. Salah satu teknik yang banyak muncul dalam penelitian saya adalah menggunakan callback. Sementara saya memahami proses bagaimana menulis dan menjalankan fungsi callback, saya bingung mengapa callback tampaknya secara otomatis membuat eksekusi JavaScript tidak sinkron. Jadi, pertanyaan saya adalah: bagaimana cara menambahkan fungsi callback ke kode JavaScript saya membuat kode tersebut secara otomatis async?

Zach Dziura
sumber
2
Anda mungkin tertarik membaca bagaimana browser mencapai ini dalam satu utas, ditulis oleh John Resig: ejohn.org/blog/how-javascript-timers-work
Jalayn
@Jalayn. Terima kasih. Komentar Anda membuat semua perbedaan setelah membaca beberapa jawaban.
kushalvm

Jawaban:

26

Tidak. Hanya menerima panggilan balik atau menyampaikan panggilan balik tidak berarti itu tidak sinkron.

Misalnya, .forEachfungsi ini mengambil panggilan balik tetapi sinkron.

var available = false;
[1,2,3].forEach( function(){
    available = true;
});
//code here runs after the whole .forEach has run,
//so available === true here

The setTimeoutmengambil callback terlalu dan asynchronous.

function myFunction( fn ) {
    setTimeout( function() {
        fn(1,2,3);
    }, 0 );
}

var available = false;
myFunction( function() {
    available = true;
});
//available is never true here

Menghubungkan ke acara asinkron apa pun di Javascript selalu membutuhkan panggilan balik tetapi itu tidak berarti memanggil fungsi atau meneruskannya selalu asinkron.

Esailija
sumber
2
@SteveEvers Saya kira Anda bisa mengedit artikel MDN kemudian. Callback adalah istilah yang sangat umum dalam javascript untuk fungsi apa pun yang diteruskan ke fungsi lain yang membuat Anda kembali menggunakan fungsi yang Anda berikan ... mengapa membuatnya rumit? Sunting: Callback juga digunakan dalam spesifikasi
Esailija
3
@SteveEvers "callback menyiratkan asyncrony" adalah keistimewaan C # / Microsoft. en.wikipedia.org/wiki/Callback_(computer_programming)
Esailija
1
@ MikeBrown Saya kira saya terlalu banyak membaca profilnya dan ini - jawaban yang paling banyak dipilih tentu saja memberikan ide bahwa "callback menyiratkan asinkron".
Esailija
1
Tapi itu dikatakan @SteveEvers juga salah. Panggilan balik tidak menyiratkan sinkronisasi, hanya saja orang lain akan bertanggung jawab untuk "menelepon kembali".
Michael Brown
1
+1 karena Steve Evers salah
slebetman
23

Rahasia "sihir" adalah bahwa peristiwa yang Anda tetapkan untuk panggilan balik tidak sinkron. Mereka diimplementasikan "di bawah tenda" untuk mengurus apa pun yang mereka lakukan (seperti mengambil sesuatu dari server jauh) di latar belakang, di luar kotak pasir JS. Dan setelah mereka selesai dengan pekerjaan mereka, mereka memberikan mesin JS pesan untuk memanggil suatu acara. Ketika mesin JS selesai dengan apa pun yang sedang dilakukannya, ia akan memanggil setiap peristiwa yang sedang antri (atau menunggu pesan baru) dan kemudian panggilan balik Anda "secara ajaib" dipanggil secara tidak sinkron!

( CATATAN: Ini adalah ikhtisar konseptual tingkat tinggi dari topik yang tidak merinci, karena mesin JS yang berbeda akan mengimplementasikan berbagai hal dengan cara yang berbeda. Tetapi ini adalah gagasan umum tentang cara kerjanya.)

Mason Wheeler
sumber
Peristiwa apa ini? Contoh satu atau dua peristiwa semacam itu akan membuat jawaban Anda lebih baik.
Jo Smo