2015-09-19 16 views
6

Ho una funzione che restituisce una Promessa.Ci sono degli effetti collaterali (negativi) quando non uso la funzione "allora" di una Promessa?

Ora, a volte è logico che il consumatore utilizzi la funzione "allora" su tale Promessa. Ma a volte il consumatore semplicemente non si preoccupa di quando la Promessa si risolve, e anche non del risultato - in altre parole la stessa funzione dovrebbe anche essere chiamata in un modo "fuoco e dimentica".

quindi voglio questi scenari due di utilizzo:

func().then(...); // process Promise 
func(); // "fire and forget" 

Questo funziona a quanto pare, ma mi chiedo se questo è considerato "cattiva pratica", in particolare se questo modello di utilizzo potrebbe avere effetti collaterali indesiderati, vale a dire . portando a perdite di memoria? In questo momento sto usando bluebird, ma considero di passare alle Promesse native se questo fa alcuna differenza.

+0

+1, anche se non penso che avrebbe causato alcun problema. ma come hai chiesto sulla perdita di memoria .. Sono curioso di sapere :) – agpt

+1

possibile duplicato di [Posso licenziare e dimenticare una promessa in nodejs (ES7)?] (http://stackoverflow.com/q/32384449/ 1048572) (che usa la sintassi 'async' /' await', ma la premessa è la stessa) – Bergi

+0

Sì, i suoni di Bergi sono almeno simili - scusa se non ho trovato questo quando cercavo una risposta. L'unica differenza è che non sto usando il nodo però. –

risposta

4

Ricorda che ogni chiamata a then genera una nuova promessa. Quindi qualsiasi implementazione Promise che ha avuto una perdita di memoria come risultato di una promessa che non prevede l'aggiunta di alcun gestore di risoluzione sarebbe un'implementazione interrotta, con tutte quelle promesse che non si collegheranno mai ai gestori. Dubito fortemente delle promesse native di ES6 sui pochi motori in cui sono state implementate finora o Bluebird ha quel comportamento.

Separatamente, come concettualmente i gestori di risoluzione di una promessa sono fondamentalmente solo funzioni memorizzate in un array o in un elenco e quindi richiamati quando appropriato, non è probabile che si verifichi una perdita di memoria se non si inseriscono mai funzioni in quegli array/elenchi.

Se il fatto che then restituisce una nuova promessa è una sorpresa, prendere in considerazione:

let p1 = new Promise(resolve => { 
    setTimeout(() => { 
    resolve('a'); 
    }, 100); 
}); 
let p2 = p1.then(result => { 
    console.log("p1.then got " + result); 
    return 'b'; 
}); 
p2.then(result => { 
    console.log("p2.then got " + result); 
}); 

quali uscite

 
p1.then got a 
p2.then got b 

Live Copy on Babel's REPL

+0

Buoni argomenti, grazie! –

+1

Non ho affrontato la parte "cattiva pratica" in quanto probabilmente è soggettiva. Ma noterò che è molto comune non usare il valore di ritorno di una funzione, che è probabilmente l'equivalente non promettente di non aggiungere alcun gestore alla promessa. –

Problemi correlati