Maison > interface Web > js tutoriel > Comment accéder aux résultats précédents lors du chaînage de promesses en JavaScript ?

Comment accéder aux résultats précédents lors du chaînage de promesses en JavaScript ?

Susan Sarandon
Libérer: 2024-11-28 10:04:12
original
529 Les gens l'ont consulté

How to Access Previous Results When Chaining Promises in JavaScript?

Enchaînement des promesses et partage des résultats précédents

Dans ce scénario, vous devez effectuer une série de requêtes HTTP, en transmettant les données de réponse d'une requête au suivant en utilisant Promise.join de Bluebird. Le défi réside dans l'accès aux données de réponse de la première requête.

Pour y parvenir, vous pouvez utiliser l'une des plusieurs approches suivantes :

Option 1 : transmettre le résultat de l'un au suivant

Cette approche consiste à enchaîner directement les promesses, en transmettant le résultat d'une requête en entrée à la suivante. Chaque gestionnaire .then() suivant a accès uniquement au résultat le plus récent :

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]);
});
Copier après la connexion

Cependant, cette approche ne permet pas d'accéder aux résultats précédents.

Option 2 : Attribuer Résultats intermédiaires à une portée supérieure

Ici, vous attribuez des résultats intermédiaires à des variables déclarées dans une portée supérieure. Cela donne accès à tous les résultats précédents dans les gestionnaires .then() suivants :

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;
});
Copier après la connexion

Option 3 : Accumuler les résultats dans un seul objet

Cette approche implique la création d'un objet pour accumuler les résultats au fur et à mesure qu’ils deviennent disponibles. Chaque gestionnaire .then() ajoute son résultat à l'objet, permettant d'accéder à tous les résultats précédents :

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;
});
Copier après la connexion

Option 4 : Nest Promises

Les promesses d'imbrication vous permettent pour accéder à tous les résultats précédents dans les scopes imbriqués :

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
        });
    });
})
Copier après la connexion

Option 5 : Rompre la chaîne en indépendant Pièces

Si certaines parties de la chaîne peuvent s'exécuter indépendamment, vous pouvez rompre la chaîne, les lancer séparément et utiliser Promise.all() pour collecter les résultats :

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
});
Copier après la connexion

Option 6 : Séquence avec wait dans ES7

Les promesses fournissent un moyen de séquencer des opérations asynchrones. Dans ES7, vous pouvez utiliser wait pour séquencer ces opérations, simplifiant ainsi le processus :

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
});
Copier après la connexion

Notez que chaque option a ses propres avantages et inconvénients. Choisissez celui qui correspond le mieux aux exigences spécifiques de votre application.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal