2016-04-28 4 views
18

Una delle nostre pagine è molto pesante. Per ridurre il conteggio degli osservatori e per accelerare il ciclo di digitazione angolare, stiamo utilizzando molto la sintassi On-Time-binding ::. Stiamo anche utilizzando angular-bind-notifier per evitare gli orologi superflui sulle nostre espressioni in questa pagina.AngularJS digest postDigestQueue

Questa strategia ci ha permesso di ridurre considerevolmente il ciclo di digestione angolare.

Ma questa strategia ha lato uno giù: Esso utilizza il $$postDigest (postDigestQueue) per unwatch l'espressione dopo che è stato valutato con successo.

E allora?

Alla fine del digest, l'angolare passerà attraverso lo postDigestQueue. Poiché abbiamo utilizzato molte espressioni in tempo vincolante, il nostro postDigestQueue può crescere fino a oltre 100.000 attività in coda.

Il problema è che angolare utilizza il following code loop tramite la coda:

while (postDigestQueue.length) { 
    try { 
    postDigestQueue.shift()(); 
    } catch (e) { 
    $exceptionHandler(e); 
    } 
} 

Il metodo di spostamento rimuove l'elemento all'indice zeroeth e sposta i valori in indici consecutivi scorrimento, quindi restituisce la rimosso il valore .

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift

Sì, Array.prototype.shift() è una chiamata molto costoso quando c'è un sacco di elementi dell'array.

A causa di ciò, il nostro ciclo di digest richiederà talvolta più di 20 secondi.

Quando cambiamo il codice precedente con il seguente, è il modo più veloce:

for (var i = 0; i < postDigestQueue.length; i++) { 
    try { 
    postDigestQueue[i](); 
    } catch (e) { 
    $exceptionHandler(e); 
    } 
} 
postDigestQueue.length = 0; 

C'è una ragione per cui lo hanno fatto? Non dovremmo usare così tanto l'unica volta vincolante?

Potrei vedere un motivo: se un'attività si aggiunge un'attività necessaria in coda. È possibile? ($$postDigest è una coda privata) Una risposta sarebbe utilizzare pop anziché shift se l'ordine di esecuzione non è importante, ma è vero?

Edit: L'ordine sembra importante perché il postDigestQueue viene utilizzato con le animazioni.

Se qualcuno è interessato a possibili follow up ufficiali, I opened an issue on the issue tracker.

+1

Ho aggiunto il tuo problema github alla domanda. Questa è una domanda molto interessante! – DrColossos

+1

Questa è una grande domanda e sembra essere una interessante richiesta di miglioramento. – Hitmands

+0

La mia semplice ipotesi è che angularJS 1.x non sia stato progettato per gestire pagine veramente pesanti, si suppone che le pagine standard siano luci. Questo è il motivo per cui tutte le reti puramente grosse sono infernali quando si dispone di una grande quantità di dati e quindi non hanno ottimizzato così parti del loro codice. – Walfrat

risposta