Lihat kode ini :
<a href="#" id="link">Link</a>
<span>Moving</span>
$('#link').click(function () {
console.log("Enter");
$('#link').animate({ width: 200 }, 2000, function() {
console.log("finished");
});
console.log("Exit");
});
Seperti yang Anda lihat di konsol, fungsi "animate" asinkron, dan "fork" adalah alur kode blok pengendali event. Faktanya :
$('#link').click(function () {
console.log("Enter");
asyncFunct();
console.log("Exit");
});
function asyncFunct() {
console.log("finished");
}
ikuti aliran kode blok!
Jika saya ingin membuat function asyncFunct() { }
perilaku saya dengan ini, bagaimana saya bisa melakukannya dengan javascript / jquery? Saya pikir ada strategi tanpa menggunakan setTimeout()
javascript
jquery
function
asynchronous
markzzz
sumber
sumber
Jawaban:
Anda tidak dapat membuat fungsi asinkron yang benar-benar tersuai. Anda akhirnya harus memanfaatkan teknologi yang disediakan secara asli, seperti:
setInterval
setTimeout
requestAnimationFrame
XMLHttpRequest
WebSocket
Worker
onload
Bahkan, untuk animasi jQuery menggunakan
setInterval
.sumber
setInterval
) tetapi kita bahkan tidak bisa membukanya untuk melihat bagaimana hal itu dilakukan. Apakah Anda memiliki lebih banyak informasi tentang masalah ini?setImmediate
promises
. Apakah itu memberiawaitable
?Anda dapat menggunakan timer:
(di mana
yourFn
referensi ke fungsi Anda)atau, dengan Lodash :
sumber
setTimeout
adalah 4 milidetik oleh HTML5 spec. Memberinya 0 masih akan mengambil jumlah waktu minimum itu. Tapi ya, itu berfungsi dengan baik sebagai penunda fungsi.di sini Anda memiliki solusi sederhana (tulis lain tentang itu) http://www.benlesh.com/2012/05/calling-javascript-function.html
Dan di sini Anda memiliki solusi siap di atas:
TEST 1 ( dapat menampilkan '1 x 2 3' atau '1 2 x 3' atau '1 2 3 x' ):
TEST 2 ( akan selalu menampilkan 'x 1' ):
Fungsi ini dijalankan dengan batas waktu 0 - ini akan mensimulasikan tugas asinkron
sumber
console.log(1)
dipanggil dan output (undefined
) diteruskan sebagai argumen ke-2async()
. Dalam kasus TEST 1, saya pikir Anda tidak sepenuhnya memahami antrian eksekusi JavaScript. Karena setiap panggilanconsole.log()
terjadi dalam tumpukan yang sama,x
dijamin akan dicatat terakhir. Saya akan memilih jawaban ini untuk informasi yang salah tetapi tidak memiliki cukup perwakilan.async(function() {console.log('x')}, function(){console.log(1)});
.TEST 2 as: async(function() {console.log('x')}, function(){console.log(1)});
- saya sudahBerikut adalah fungsi yang mengambil fungsi lain dan menampilkan versi yang menjalankan async.
Ini digunakan sebagai cara sederhana untuk membuat fungsi async:
Ini berbeda dari jawaban @ fider karena fungsi itu sendiri memiliki struktur sendiri (tidak ada panggilan balik ditambahkan, itu sudah ada dalam fungsi) dan juga karena ia menciptakan fungsi baru yang dapat digunakan.
sumber
(function(a){ asyncFunction(a); })(a)
setTimeout(asyncFunction, 0, a);
Sunting: Saya benar-benar salah paham pertanyaannya. Di browser, saya akan menggunakan
setTimeout
. Jika penting menjalankannya di utas lain, saya akan menggunakan Pekerja Web .sumber
Terlambat, tetapi untuk menunjukkan solusi yang mudah digunakan
promises
setelah diperkenalkan di ES6 , ini menangani panggilan asinkron jauh lebih mudah:Anda menetapkan kode asinkron dalam janji baru:
Catatan untuk mengatur
resolve()
kapan panggilan async selesai.Kemudian Anda menambahkan kode yang ingin Anda jalankan setelah panggilan async selesai di
.then()
dalam janji:Berikut ini cuplikannya:
atau JSFiddle
sumber
Halaman ini menuntun Anda melalui dasar-dasar membuat fungsi javascript async.
Sejak ES2017, fungsi javacript asinkron jauh lebih mudah untuk ditulis. Anda juga harus membaca lebih lanjut tentang Janji .
sumber
Jika Anda ingin menggunakan Parameter dan mengatur jumlah fungsi async maksimum, Anda bisa menggunakan pekerja async sederhana yang saya buat:
Anda bisa menggunakannya seperti ini:
sumber
Meskipun secara fundamental tidak berbeda dari solusi lain, saya pikir solusi saya melakukan beberapa hal baik tambahan:
Function.prototype
memungkinkan cara yang lebih baik untuk menyebutnyaJuga, kesamaan dengan fungsi
Function.prototype.apply
bawaan sepertinya cocok untuk saya.sumber
Di samping jawaban hebat oleh @pimvdb, dan untuk berjaga-jaga jika Anda bertanya-tanya, async.js juga tidak menawarkan fungsi yang benar-benar tidak sinkron. Berikut ini adalah versi (sangat) dari metode utama perpustakaan:
Jadi fungsi melindungi dari kesalahan dan dengan anggun menyerahkannya ke callback untuk ditangani, tetapi kode ini sama sinkronnya dengan fungsi JS lainnya.
sumber
Sayangnya, JavaScript tidak menyediakan fungsionalitas async. Ini hanya berfungsi dalam satu utas tunggal. Tapi sebagian besar browser modern memberikan
Worker
s , yang script kedua yang dijalankan di latar belakang dan dapat kembali hasilnya. Jadi, saya mencapai solusi yang menurut saya berguna untuk menjalankan fungsi secara tidak sinkron, yang menciptakan pekerja untuk setiap panggilan async.Kode di bawah ini berisi fungsi
async
untuk memanggil di latar belakang.Ini adalah contoh untuk penggunaan:
Ini mengeksekusi fungsi yang iterasi a
for
dengan jumlah yang sangat besar untuk mengambil waktu sebagai demonstrasi asinkronisitas, dan kemudian mendapatkan dua kali lipat dari angka yang dilewati. Theasync
Metode menyediakanfunction
yang memanggil fungsi yang diinginkan di latar belakang, dan di mana yang disediakan sebagai parameterasync
callback yangreturn
dalam parameter yang unik. Jadi dalam fungsi callback sayaalert
hasilnya.sumber
MDN memiliki contoh yang baik tentang penggunaan setTimeout yang mempertahankan "ini".
Seperti yang berikut ini:
sumber