Merangkai Janji dan Berkongsi Hasil Terdahulu
Dalam senario ini, anda perlu membuat satu siri permintaan HTTP, menghantar data respons daripada satu permintaan ke seterusnya menggunakan Bluebird's Promise.join. Cabarannya terletak pada mengakses data respons daripada permintaan pertama.
Untuk mencapai matlamat ini, anda boleh menggunakan salah satu daripada beberapa pendekatan:
Pilihan 1: Suapan Hasil Satu ke Seterusnya
Pendekatan ini melibatkan rantaian janji secara langsung, menghantar hasil satu permintaan sebagai input kepada yang seterusnya. Setiap pengendali .then() berikutnya mempunyai akses hanya kepada hasil terbaharu:
Promise.join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload) ).then(function(first, second, third) { console.log([first, second, third]); });
Walau bagaimanapun, pendekatan ini tidak membenarkan akses kepada hasil sebelumnya.
Pilihan 2: Tetapkan Keputusan Pertengahan kepada Skop Lebih Tinggi
Di sini, anda memperuntukkan hasil perantaraan kepada pembolehubah yang diisytiharkan dalam yang lebih tinggi skop. Ini menyediakan akses kepada semua hasil sebelumnya dalam pengendali .then() berikutnya:
var r1, r2, r3; Promise.join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload) ).then(function(result1, result2, result3) { r1 = result1; r2 = result2; r3 = result3; });
Pilihan 3: Kumpul Hasil dalam Satu Objek
Pendekatan ini melibatkan penciptaan objek untuk mengumpul hasil apabila ia tersedia. Setiap pengendali .then() menambah hasilnya pada objek, membenarkan akses kepada semua hasil sebelumnya:
var results = {}; Promise.join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload) ).then(function(result1, result2, result3) { results.result1 = result1; results.result2 = result2; results.result3 = result3; });
Pilihan 4: Nest Promises
Nesting promises membolehkan anda untuk mengakses semua hasil sebelumnya dalam skop bersarang:
Promise.join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload) ).then(function(result1) { // result1 is available here return Promise.join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload) ).then(function(result2) { // result1 and result2 are available here return Promise.join( callhttp("172.16.28.200", payload) ).then(function(result3) { // result1, result2 and result3 are available here }); }); })
Pilihan 5: Putuskan Rantai menjadi Potongan Bebas
Jika sesetengah bahagian rantaian boleh dilaksanakan secara bebas, anda boleh memutuskan rantai itu, melancarkannya secara berasingan dan menggunakan Promise.all() untuk mengumpul keputusan:
var p1 = callhttp("172.16.28.200", payload); var p2 = callhttp("172.16.28.200", payload).then(function(result2) { return someAsync(result2); }).then(function(result2a) { return someOtherAsync(result2a); }); var p3 = callhttp("172.16.28.200", payload).then(function(result3) { return someAsync(result3); }); Promise.all([p1, p2, p3]).then(function(results) { // multiple results available in results array // that can be processed further here with // other promises });
Pilihan 6: Urutan dengan menunggu dalam ES7
Janji menyediakan cara untuk menyusun operasi tak segerak. Dalam ES7, anda boleh menggunakan await untuk menyusun operasi ini, memudahkan proses:
async function someFunction() { const r1 = await callhttp("172.16.28.200", payload); // can use r1 here to formulate second http call const r2 = await callhttp("172.16.28.200", payload); // can use r1 and r2 here to formulate third http call const r3 = await callhttp("172.16.28.200", payload); // do some computation that has access to r1, r2 and r3 return someResult; } someFunction().then(result => { // process final result here }).catch(err => { // handle error here });
Perhatikan bahawa setiap pilihan mempunyai kelebihan dan kekurangannya sendiri. Pilih yang paling sesuai dengan keperluan khusus aplikasi anda.
Atas ialah kandungan terperinci Bagaimana untuk Mengakses Keputusan Sebelumnya Apabila Merangkai Janji dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!