2016-01-04 10 views
5

ho bisogno di ignorare il seguente codiceSuccessiva funzionalità tick di override fa funzione verrà chiamata

Qui la funzione verrà eseguita nel prossimo tick

req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) { 
    setTimeout(fn, 5); 
} : function (fn) { fn(); }; 

con questo,

window.require.nextTick = function(fn) { fn(); }; 

Dal momento che la funzione verrà chiamata immediatamente, In questo caso non verrà eseguita al prossimo tick?

+0

cosa vuoi esattamente? –

+0

@BhojendraNepal - Voglio verificare se la funzione verrà richiamata al prossimo segno di spunta dopo la modifica ... –

+0

la funzione definita definitivamente sovrascriverà quella precedente in modo che la precedente non venga eseguita. –

risposta

2

se cambio il codice nella seconda opzione whethaer Sarà problematico e se sì perché ???

Non consiglio di apportare questo cambiamento, perché può essere problematico, in generale. La documentazione per require.nextTick (che appare subito prima della definizione della funzione) dice:

Esegui qualcosa dopo il tick corrente del loop eventi.

La chiamata fn viola in modo sincrono la specifica che l'esecuzione dovrebbe avvenire "dopo il tick corrente". (Vedere la fine della mia risposta per una possibile obiezione qui.)

Se ti chiedi perché potrebbe essere un problema, considera che RequireJS ascolta gli eventi DOM. Una cosa che ha una funzione come require.nextTick è dare una possibilità ai gestori di eventi di eseguire. Se si imposta require.nextTick per eseguire la sua funzione in modo sincrono, non si dà la possibilità ai gestori di eventi di eseguire. In alcuni casi ciò potrebbe impedire a RequireJS di funzionare correttamente.

A questo punto, si potrebbe obiettare la definizione di nextTick è tale che è bene per averlo chiamare fn modo sincrono, perché se setTimeout non è definito, poi lo fa chiamare fn sincrono:

req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) { 
    setTimeout(fn, 4); 
} : function (fn) { fn(); }; 

Penso che questo sia inteso per casi insoliti, non la situazione run-of-the-mill in cui i moduli vengono caricati tramite richieste HTTP in modo asincrono. In alcuni casi, come forse i dispositivi incorporati che non dispongono dell'ambiente JS fornito dai browser o dai Nodi.js, l'unico modo per eseguire un software che utilizza RequireJS è caricare un bundle ottimizzato che sia passato attraverso r.js e includere require.js nel pacchetto. In un caso come questo, averechiamata fn in modo sincrono sarebbe discutibile perché, nel momento in cui RequireJS viene eseguito, tutti i moduli sono già stati caricati.

1

Se si dispone di una funzione come questa:

window.require.nextTick = function(fn) { fn(); }; 

ogni volta si chiama window.require.nextTick(), verrà eseguita immediatamente fn().

se cambio il codice per la seconda opzione whethaer Sarà problematico

No, non causerà alcun problema. L'unica differenza tra il primo e il secondo codice è che nel primo fn() viene chiamato dopo 5 millisecondi e nel secondo viene chiamato immediatamente. In entrambi gli esempi, fn() verrà chiamato ogni volta che si chiama window.require.nextTick().

1

C'è qualcosa di fondamentalmente sbagliato nella funzione originale. Si comporta molto in modo diverso se setTimeout non è definito.

Javascript viene eseguito su un event loop. Il codice Javascript viene eseguito fino a quando non viene eseguito e un altro codice JavaScript attende il suo turno nella "coda". Ad esempio, un listener di eventi per un evento utente (come fare clic su un pulsante) viene "messo in coda" e attende il completamento del codice corrente.

La tua funzione nextTick è presumibilmente pensata per aggiungere una funzione alla "coda" in modo che venga eseguita successivamente dal ciclo degli eventi. Questo a volte è utile. Ad esempio, puoi avere il tuo emettitore di eventi e vuoi mettere in coda il tuo evento.

La tua funzione nextTick è pertanto interrotta se setTimeout non è definita. Eseguirà la funzione ora invece di aggiungerla alla "coda". Ciò comporterà il comportamento totalmente diverso, che significa bug che si verificano solo per determinati browser.

prega fissare il codice per utilizzare questo, invece:

window.require.nextTick = function(fn) { setTimeout(fn, 5) }; 

e ignorare i browser che non implementano setTimeout. Possono avere un grosso errore di grasso invece di strani bug sottili.

Solo per la cronaca, setTimeout funziona in tutti i principali browser negli ultimi 20 anni circa. È supportato su IE4! Quindi questo condizionale è completamente inutile.

Problemi correlati