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
Susan Sarandonasal
2024-11-28 10:04:12603semak imbas

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]);
});

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!

Kenyataan:
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