Qual è il vantaggio di appiattire le Promesse dipendenti

2

Ho letto che la continuazione di Promessa di annidamento è una cattiva pratica. Ad esempio, qui .

GetCustomer().then(customer => {
    ProcessCustomer(customer).then(processingResult =>
    {
        console.log(customer);
        console.log(processingResult);
    });
});

Poiché la seconda chiamata di funzione si basa sull'output del primo, annullando l'annidamento appare come questo ...

GetCustomer().then(customer => {
        return Promise.all([customer, ProcessCustomer(customer)]);
    }).then(results => {
        console.log(results[0]);
        console.log(results[1]);
    });

Personalmente trovo lo stile nidificato più facile da leggere e ragionare. Mi piacciono anche le variabili con un nome strong, come indicato per accedere a results[i] , che potrebbe essere soggetto a errori.

Quali sono gli svantaggi del primo approccio e / oi vantaggi del secondo?

    
posta Tom Bowers 25.06.2018 - 02:41
fonte

1 risposta

2

L'opzione più semplice per avere accesso a customer e processingResult senza nidificazione sarebbe probabilmente quella di utilizzare async/await (funzione ES7) come questa (questo dovrebbe essere all'interno di una dichiarazione di funzione async ):

async function someFunction() {
    const customer = await GetCustomer();
    const processingResult = await ProcessCustomer(customer);
    console.log(customer);
    console.log(processingResult);
    return someValue;
}

// usage
someFunction().then(result => {
    // done here
}).catch(err => {
    console.log(err);
});

What are the disadvantages of the first approach,

A soli due livelli come questo, non ci sono particolari svantaggi nel nesting. È necessario restituire la promessa interiore per poter ottenere il risultato finale e la gestione completa degli errori. Quindi, per utilizzare correttamente la prima opzione con il nesting, è necessario almeno restituire la promessa interiore in modo da poter rilevare tutti gli errori al livello più alto:

GetCustomer().then(customer => {
    return ProcessCustomer(customer).then(processingResult => {
        console.log(customer);
        console.log(processingResult);
        return someValue;
    });
}).catch(err => {
    // catch all errors here
    console.log(err);
});

Se ottieni più livelli, il nesting diventa sempre meno leggibile.

and/or the advantages of the second?

È davvero solo un'opinione personale a questo punto. Personalmente non sono un fan del passaggio di un valore non elaborato a Promise.all() solo così passerà a un comune .then() handler. Sembra che il codice sia più complicato di quanto non sia in realtà (ma è solo una mia opinione). Funzionerebbe perfettamente.

Questo è un luogo in cui l'oggetto che distrugge renderebbe le cose un po 'più leggibili e hai bisogno di un .catch() gestore:

GetCustomer().then(customer => {
    return Promise.all([customer, ProcessCustomer(customer)]);
}).then(([customer, processedCustomer]) => {
    console.log(customer);
    console.log(processedCustomer);
}).catch(err => {
    console.log(err);
});

Per una serie di altre opzioni, vedi qui:

Come concatenare e condividere i risultati precedenti Con promesse

    
risposta data 25.06.2018 - 23:33
fonte

Leggi altre domande sui tag