Rumah > hujung hadapan web > tutorial js > Bagaimana untuk Mengakses Keputusan Sebelumnya Apabila Merangkai Janji dalam JavaScript?

Bagaimana untuk Mengakses Keputusan Sebelumnya Apabila Merangkai Janji dalam JavaScript?

Susan Sarandon
Lepaskan: 2024-11-28 10:04:12
asal
529 orang telah melayarinya

How to Access Previous Results When Chaining Promises in JavaScript?

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]);
});
Salin selepas log masuk

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;
});
Salin selepas log masuk

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;
});
Salin selepas log masuk

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
        });
    });
})
Salin selepas log masuk

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
});
Salin selepas log masuk

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
});
Salin selepas log masuk

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan