Cara menangani pelbagai isu konkurensi dalam kemahiran JavaScript_javascript

WBOY
Lepaskan: 2016-05-16 15:34:48
asal
1485 orang telah melayarinya

Saya sering menghadapi senario ini semasa menulis kod: halaman pemuatan dipaparkan apabila halaman dimulakan, berbilang permintaan serentak ajax dimulakan untuk mendapatkan data dan pemuatan tamat apabila setiap permintaan ajax kembali.

Sebagai contoh, halaman untuk membuat pesanan perlu menanyakan maklumat alamat biasa, maklumat produk, maklumat bandar...dan permintaan ini adalah tidak segerak pengguna tidak akan dibenarkan beroperasi sehingga semua data dimuatkan .

Masalah yang mudah dihadapi apabila melaksanakan senario ini ialah bagaimana untuk mengawal berbilang konkurensi? Berikut ialah beberapa penyelesaian dan idea:

Sejajar ditukar kepada bersiri

Jika logik perniagaan itu sendiri adalah bersiri, tetapi kaedah permintaan yang disediakan adalah tak segerak, anda boleh pertimbangkan kaedah ini.
Tetapi ini jelas tidak berlaku dalam senario ini. Melakukannya sangat mengurangkan prestasi halaman dan memanjangkan kelajuan pemuatan.

Panggil balik

Hanya sesuai untuk situasi di mana bilangan mata wang adalah kecil Berbilang peringkat panggilan balik bersarang akan mengurangkan kebolehbacaan kod itu dengan ketara

function async1(){
  //do sth...
}
function async2(){
  //do sth...
  async1();
}
async2();

Salin selepas log masuk

ajax ditukar kepada penyegerakan

Tetapkan parameter async kepada false dalam jquery

$.ajax({
  url:"/jquery/test1.txt",
  async:false
});
Salin selepas log masuk

Tetapkan bendera akhir

Pendekatan yang lebih mudah ialah dengan menyediakan pembilang yang meningkat sebanyak 1 setiap kali fungsi tak segerak selesai, atau menyediakan tatasusunan dan mengemas kini tatasusunan setiap kali fungsi tak segerak dilaksanakan.

Kira Panggilan Balik

var cnt = 0;
function async1(){
  //do sth...
  callback();
}
function async2(){
  //do sth...
  callback();
}
function callback(){
  cnt++;
  if(2==cnt) console.log('都已执行完毕');
}

Salin selepas log masuk

Gelung disekat

var cnt = 0;
function async1(){
  //do sth...
  cnt++;
}
function async2(){
  //do sth...
  cnt++;
}
while(2>cnt){}

Salin selepas log masuk

Gelung tidak menyekat

Tidak digalakkan untuk menggunakannya terlalu banyak untuk mengelakkan menjejaskan prestasi

var cnt = 0;
function async1(){
  //do sth...
  cnt++;
}
function async2(){
  //do sth...
  cnt++;
}
var interval = setInterval(function(){
  if(2===cnt){
    console.log('已执行完成');
    clearInterval(interval)
  }
}

Salin selepas log masuk

Pelaksanaan rangka kerja pihak ketiga

jquery

Pendekatan semasa yang saya gunakan dalam projek saya

var d1 = $.Deferred();
var d2 = $.Deferred();
function async1(){
  d1.resolve( "Fish" );
}
function async2(){
  d2.resolve( "Pizza" );
}
$.when( d1, d2 ).done(function ( v1, v2 ) {
  console.log( v1 + v2 + '已完成');
});
Salin selepas log masuk
Kandungan di atas ialah pengetahuan berkaitan yang diperkenalkan oleh editor tentang cara menangani pelbagai isu konkurensi dalam JavaScript. Saya harap ia akan membantu anda.

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan