Devo restituire promesse da qualsiasi funzione che le utilizza?

4

Le promesse sono un modello abbastanza nuovo per me, quindi sto ancora costruendo il mio intuito per loro.

Recentemente mi sono imbattuto in un caso in cui un codice in un bit di codice simile ad un adattatore era una volta sincrono, e quindi divenne asincrono, quindi furono introdotte delle promesse. Prendere in considerazione:

function runCalculation() {
  var params = this.getParams();
  this.callLibraryCalculation(params);
}

Qui getParams raccoglie valori da vari luoghi e li inserisce in un unico oggetto che può essere utilizzato da callLibraryCalculation , che include, come ci si aspetterebbe, una chiamata da un fonte esterna. Tutto questo è ovviamente semplificato ai fini della domanda.

Quindi tutto ha funzionato, finché non è stato necessario un nuovo caso di utilizzo getParams per recuperare alcuni valori da un'API esterna, introducendo un comportamento asincrono. Quindi questa funzione è stata modificata per gestire asincroni, utilizzando e restituendo una promessa. Il che significa che il consumo è cambiato.

function runCalculation() {
  return this.getParams().then(function(params) {
    this.callLibraryCalculation(params);
  });
}

Ho scelto di restituire la promessa qui perché le funzioni che chiamano runCalculation hanno una logica dipendente che deve essere .then () -ed. ma la mia domanda riguarda i chiamanti di runCalculation . Ora stanno producendo le loro promesse a seguito del consumo di quello restituito qui. Attualmente posso lasciare la maggior parte di quelle promesse fuggire nell'etere, perché i chiamanti rappresentano la fine dell'esecuzione. Ma noto che nel caso in cui non sia la fine dell'esecuzione, questo passaggio di promesse inizia a invadere una grande quantità di codice, che ribolle dal chiamante al chiamante.

La mia inclinazione è di restituire sempre una promessa da una funzione che deve usarne una per ordinare la sua logica.

Questa inclinazione è una buona intuizione? Dovrei essere preoccupato che Promises, una volta introdotto, inizi a prendere il mio codice?

O per porre una domanda più rispondente: Ci sono delle considerazioni che potrei aver mancato che parlano a favore o contro tale pratica?

    
posta TwainJ 09.01.2016 - 03:35
fonte

1 risposta

5

My inclination is to always return a promise from a function that must use one to order it's logic.

Se hai una funzione con un'operazione asincrona e stai usando le promesse e c'è sempre QUALUNQUE ragione per cui il chiamante della funzione voglia sapere quando l'operazione asincrona viene eseguita o quale sia il suo valore finale, allora con tutti i mezzi solo restituire la promessa che hai già internamente.

Questo dà al chiamante una maggiore flessibilità. Se il chiamante sceglie di non utilizzare la promessa restituita, non c'è problema. Almeno è lì se il chiamante vuole usarlo.

Should I be worried that Promises, once introduced, start to take over my code?

Non sono sicuro di cosa intendi con "prendi il tuo codice". Se si desidera consentire a un chiamante l'accesso al completamento asincrono, restituire una promessa. Se non si desidera dare a un chiamante l'accesso al completamento asincrono, non restituire una promessa. Non è più complesso di così.

Qualsiasi operazione asincrona in una funzione rende asincrona la funzione di contenimento. È contagioso al riguardo. E le promesse sono il modo migliore per fornire risultati asincroni e coordinare più operazioni asincrone. Quindi, tutto il codice che usa le operazioni asincrone dovrebbe usare le promesse. Questo non significa "prendere il controllo del tuo codice": è il modo intelligente di progettare il tuo codice asincrono. Se ora ti sembra innaturale, allora hai solo bisogno di più esperienza e pratica per farlo e comincerà a diventare naturale e facile. A quel punto, non sentirai che nulla ha preso il tuo codice, ma piuttosto che stai usando gli strumenti giusti per il lavoro.

    
risposta data 09.01.2016 - 04:39
fonte

Leggi altre domande sui tag