Saya memiliki fungsi yang harus melakukan sesuatu yang asinkron, dalam beberapa langkah. Pada setiap langkahnya bisa gagal. Ini mungkin gagal sebelum langkah 1, jadi Anda mungkin langsung mengetahui hasilnya, atau setelah 1,5 detik. Jika gagal, ia harus menjalankan panggilan balik. Idem ketika berhasil. (Saya sengaja menggunakan bila, karena ini bukan hanya jika: waktu itu penting.)
Saya pikir Janji itu sempurna, karena async dan hanya diselesaikan sekali, tetapi masih ada masalah: kapan gagal? Saya dapat melihat secara jelas kapan berhasil (setelah langkah terakhir), tetapi kapan gagal? Di dalam/sebelum langkah apa pun.
Inilah yang saya miliki sekarang, tapi itu konyol:
function clickSpeed() {
return new Promise(function(resolve, reject) {
if ( test('one') ) {
return setTimeout(function() {
if ( test('two') ) {
return setTimeout(function() {
if ( test('three') ) {
return setTimeout(function() {
console.log('resolving...');
resolve();
}, 500);
}
console.log('rejecting...');
reject();
}, 500);
}
console.log('rejecting...');
reject();
}, 500);
}
console.log('rejecting...');
reject();
});
}
(test()
lolos atau gagal satu langkah secara acak.)
Mainkan biola di sini: http://jsfiddle.net/rudiedirkx/zhdrjjx1/
Saya kira solusinya adalah dengan merangkai janji, yang menyelesaikan atau menolak setiap langkah..? Mungkin. Apakah itu suatu hal? Bagaimana saya menerapkannya?
Bisakah ini berhasil untuk sejumlah langkah yang tidak diketahui?
return
padareturn setTimeout(function() {
? - person guest271314   schedule 23.11.2015return
hanya ada untuk mencegahconsole.log('rejecting...'); reject();
berjalan - person Bergi   schedule 23.11.2015promise.then(function(res, reject) { res('step1') or reject('err')}).then(function(res) { res('step2')}).catch(function(err) { console.log(err) })
- person Errorpro   schedule 23.11.2015test
tidak menolak janji? Bagaimanareject
dipanggil berdasarkan nilai kembaliantest
, jikasetTimeout
memutus aliran? - person guest271314   schedule 23.11.2015test()
hanya mengembalikan bool. Ini mungkin bukan fungsi, tetapi pernyataan, atau periksa objek/properti lain. Penolakan terjadi setelah setiap IF. - person Rudie   schedule 23.11.2015test()
mengembalikan bool, tetapi acak hanya untuk pengujian. Dibutuhkan apa pun dari tempat lain, yang dapat menolak janji tersebut, atau memajukannya ke langkah berikutnya. Cektest()
tidak selalu berfungsi dan tidak mengenal janji. - person Rudie   schedule 23.11.2015