2016-06-28 17 views
7

Nei siti ufficiali di nodejs (https://nodejs.org/api/timers.html#timers_setimmediate_callback_arg), si dice che:setImmediate() viene chiamato dopo la funzione setTimeout()

setImmediate() orari delle funzioni di esecuzione "immediata" di callback dopo I/I callback di eventi O e i timer di prima impostati da setTimeout e setInterval vengono attivati.

Tuttavia nel codice seguente, la funzione setTimeout() eseguita prima di setImmediate(). Perché?

setImmediate(function A() { 
    setImmediate(function B() { 
    console.log(1); 
    setImmediate(function D() { console.log(2); }); 
    setImmediate(function E() { console.log(3); }); 
    }); 
    setImmediate(function C() { 
    console.log(4); 
    setImmediate(function F() { console.log(5); }); 
    setImmediate(function G() { console.log(6); }); 
    }); 
}); 

setTimeout(function timeout() { 
    console.log('TIMEOUT FIRED'); 
}, 0) 

Risultato:

 
TIMEOUT FIRED 
1 
4 
2 
3 
5 
6 

scrivo un altro esempio, e setTimeout opere prima setImmediate anche qui.

setTimeout(function timeout() { 
    console.log('TIMEOUT-1 FIRED'); 
}, 0) 

setTimeout(function timeout() { 
    console.log('TIMEOUT-2 FIRED'); 
}, 0) 

setImmediate(function D() { console.log(1); }); 
setImmediate(function D() { console.log(2); }); 
setImmediate(function D() { console.log(3); }); 

setTimeout(function timeout() { 
    console.log('TIMEOUT-1 FIRED'); 
}, 0) 

setTimeout(function timeout() { 
    console.log('TIMEOUT-2 FIRED'); 
}, 0) 

uscita:

 
TIMEOUT-1 FIRED 
TIMEOUT-2 FIRED 
TIMEOUT-1 FIRED 
TIMEOUT-2 FIRED 
1 
2 
3 
+0

In Nodo 5.6.0 per il primo ottengo '1 4 TIMEOUT LICENZIATO 2 3 5 6' – Pointy

+0

@metis quale versione di node.js sono si utilizza come sembra esserci un bug con alcune versioni precedenti: https://github.com/nodejs/node-v0.x-archive/issues/6034 –

+0

v.4.4.5 è la versione consigliata per la maggior parte degli utenti sul pagina di benvenuto di nodejs – metis

risposta

1

Consente scrivere l'esempio precedente come segue:

var fs = require('fs') 

fs.readFile("readme.txt", function(){ 
    setTimeout(function timeout() { 
     console.log('TIMEOUT-1 FIRED'); 
    }, 0) 

    setTimeout(function timeout() { 
     console.log('TIMEOUT-2 FIRED'); 
    }, 0) 

    setImmediate(function D() { console.log(1); }); 
    setImmediate(function D() { console.log(2); }); 
    setImmediate(function D() { console.log(3); }); 

    setTimeout(function timeout() { 
     console.log('TIMEOUT-1 FIRED'); 
    }, 0) 

    setTimeout(function timeout() { 
     console.log('TIMEOUT-2 FIRED'); 
    }, 0)}) 

uscita:

1 
2 
3 
TIMEOUT-1 FIRED 
TIMEOUT-2 FIRED 
TIMEOUT-1 FIRED 
TIMEOUT-2 FIRED 

Spiegazione:

L'ordine in cui vengono eseguiti i timer varia in base al contesto in cui vengono chiamati. Se entrambi vengono richiamati dal modulo principale, i tempi saranno vincolati dalle prestazioni del processo (che possono essere influenzate da altre applicazioni in esecuzione sulla macchina). Ad esempio, se eseguiamo il seguente script che non è all'interno di un ciclo I/O (cioè il modulo principale), l'ordine in cui i due timer vengono eseguiti non è deterministico, in quanto è vincolato dalle prestazioni del processo:

// timeout_vs_immediate.js 
setTimeout(function timeout() { 
    console.log('timeout'); 
},0); 

setImmediate(function immediate() { 
    console.log('immediate'); 
}); 
$ node timeout_vs_immediate.js 
timeout 
immediate 

$ node timeout_vs_immediate.js 
immediate 
timeout 

Tuttavia, se si sposta da una chiamata all'interno di un ciclo di i/O, la richiamata immediata viene sempre eseguito per primo:

// timeout_vs_immediate.js 
var fs = require('fs') 

fs.readFile(__filename,() => { 
    setTimeout(() => { 
    console.log('timeout') 
    }, 0) 
    setImmediate(() => { 
    console.log('immediate') 
    }) 
}) 
$ node timeout_vs_immediate.js 
immediate 
timeout 

$ node timeout_vs_immediate.js 
immediate 
timeout 

il principale vantaggio di utilizzare setImmediate () su setTimeout() is setImmediate() verrà sempre eseguito prima di qualsiasi timer se programmato all'interno di un ciclo I/O, indipendentemente dal numero di timer presenti.

Per maggiori informazioni, consultare il seguente link: https://github.com/nodejs/node/blob/master/doc/topics/the-event-loop-timers-and-nexttick.md

+0

Descrive solo ciò che è scritto nella documentazione principale, il che non è chiaro come funziona, in che modo è legato alle prestazioni? Cosa significa "legato alla prestazione" Questa è la domanda principale. – hsafarya

Problemi correlati