È convenzionale usare sia await che .then ()?

1

Ho scritto un po 'di codice che assomiglia a questo:

async function fetchData() {
    const json = await fetch(ENDPOINT + key.key).then(data => data.json());
    //Do something with the data
}

È abbastanza chiaro e diretto ciò che sto facendo qui.

Mi stavo chiedendo se è normale combinare sia il vecchio stile Promessa, sia il nuovo stile asincrono / attendi come questo.

Se non dovessi usare .then , sarei qualcosa del genere:

async function fetchData() {
    const data = await fetch(ENDPOINT + key.key); 
    const json = await data.json(); 
    //do something with the data
}

A meno che non manchi qualcosa qui? Suppongo che la domanda sia - è lo scopo di async / attendere di smettere di usare le promesse completamente - o cosa?

    
posta dwjohnston 15.09.2018 - 05:02
fonte

2 risposte

1

Anche nelle moderne promesse di sviluppo di applicazioni sono molto utili e generalmente non vuoi await di tutto. Perché? Perché await ing qualcosa sta bloccando.

Immagina uno scenario, in cui avresti un'applicazione e aprendo uno schermo dovresti chiamare due endpoint REST non collegati.

function loadMyProfileData(userId) { ... }
function loadOrders(userId) { ... }

Entrambe queste funzioni farebbero una richiesta di REST HTTP e restituirebbero una promessa. Se avessi la seguente funzione:

async function onScreenLoad(userId) {
    this.profileData = await loadMyProfileData(userId);
    this.orders      = await loadOrders(userId);
}

inizieresti a caricare gli ordini solo dopo che sono stati recuperati i dati del tuo profilo, anche se la funzione degli ordini non dipende affatto dal risultato dei dati del profilo.

In tale scenario è molto probabile che tu voglia cercare qualcosa di simile a questo:

async function onScreenLoad(userId) {
    let [profileData, orders] =
        await Promise.all([loadMyProfileData(userId), loadOrders(userId)]);

    this.profileData = profileData;
    this.orders      = orders;
}

In questo modo si caricano i dati contemporaneamente.

async/await è uno stupefacente zucchero sintattico, ma non deve essere dato per scontato e utilizzato senza conoscere i suoi effetti collaterali.

    
risposta data 15.09.2018 - 21:25
fonte
1

L'attesa asincrona è promessa sotto il cofano. Quindi, puoi scappare asincronicamente quando attendi per la maggior parte del tempo quando hai una sequenza di passaggi asincresi dipendenti da eseguire.

Tuttavia, ci sono momenti in cui si desidera eseguire una serie di operazioni in serie o in parallelo. Lì avrai sicuramente bisogno di Promise.all o attendi in un ciclo for.

Per quanto riguarda il tuo codice:

  1. Non è necessario await sull'istruzione return di una funzione async , puoi semplicemente restituire la promessa direttamente.
  2. Mantenere una promessa in una variabile è necessario solo quando vuoi fare qualcosa di diverso dall'attenderti.
risposta data 17.09.2018 - 07:40
fonte

Leggi altre domande sui tag