2016-10-24 3 views
1

Впечатление, которое я получаю от людей, это ... Все функции JavaScript синхронны, если они не используются с process.nextTick. Когда самое лучшее время для его использования?Когда самое лучшее время для использования process.nextTick?

Я хочу, чтобы я не использовал его в местах, где мне это не нужно. На данный момент я думаю использовать его прямо перед чем-то вроде вызова базы данных, однако, в то же время, как я понимаю, эти вызовы асинхронны по умолчанию из-за всей «асинхронной IO».

Должны ли они использоваться только при интенсивной работе внутри границ JavaScript? Как разбор XML и т. Д.?

Btw, есть вопрос like this, но он кажется мертвым, поэтому я поднял еще один.

+0

'функции синхронны, если они не используются с process.nextTick' nope, они асинхронны, когда вы используете обратные вызовы вместо возврата, и когда вам нужно что-то ждать. 'Процесс.nextTick' используется для ввода кода в цикл событий и позволяет ему очищать (например: рекурсивный цикл async-функции, что приведет к переполнению стека вызовов) – DrakaSAN

+1

@DrakaSAN Да, но на самом деле ["использование обратных вызовов" не является точно знак асинхронности] (http://stackoverflow.com/q/19083357/1048572). – Bergi

ответ

2

Этот ответ не дает никаких претензий на полноту, но вот мои мысли:

Я могу представить себе два случая использования. Первый заключается в том, чтобы убедиться, что что-то действительно асинхронно. Это пригодится при использовании EventEmitter. Представьте, что вы хотите, чтобы иметь возможность использовать все методы вашего эмиттера, как это:

const EventEmitter = require('events'); 

class MyEmitter extends EventEmitter { 
    aMethod(){ 
    console.log('some sync stuff'); 
    this.emit('aMethodResponse'); 
    return this; 
    } 
} 
var myEmitter = new MyEmitter(); 
myEmitter.aMethod() 
    .once('aMethodResponse',() => console.log('got response')); 

Это просто не будет работать, как событие вызывается перед установкой слушателя. process.nextTick() гарантирует, что этого не произойдет.

aMethod(){ 
    console.log('some sync stuff'); 
    process.nextTick(() => this.emit('aMethodResponse')); 
    return this; 
} 

Edit: удален второе предложение, потому что это было просто неправильно

+0

Хорошая мысль, но я решил запустить ее после чего-то, вам нужно было запустить 'process.setImmediate', чтобы поставить очередь на вызов после функции ввода-вывода, которая запустила бы ее дальше? Также существует установленный шаблон для обертывания функций с помощью 'process.nextTick' или' process.setImmediate'? –

+0

мой плохой, удалил вторую часть. Первая из них все еще стоит. –

3

Я имею в виду, чтобы использовать его перед чем-то вроде вызова базы данных, однако, в то же время, как я понимаю, те, по умолчанию асинхронные вызовы асинхронны из-за всего «асинхронного ввода-вывода».

Да. Сам драйвер базы данных должен быть изначально асинхронным, поэтому вам не нужно использовать process.nextTick здесь, чтобы «сделать его асинхронным». Самая трудоемкая часть - это IO и вычисления внутри базы данных, поэтому ожидание дополнительного тика просто замедляет работу на самом деле.

Должны ли они использоваться только при интенсивной работе внутри границ JavaScript? Как разбор XML и т. Д.?

Да, точно. Вы можете использовать его, чтобы предотвратить блокирование приложения большими синхронными функциями. Если вы хотите проанализировать XML-файл, вместо того, чтобы грызть его в течение 3 секунд, в течение которого никакие новые соединения не могут быть открыты, не будут получены запросы и не будут отправлены ответы, вы будете передавать этот файл и анализировать только небольшие куски его каждый раз перед использованием nextTick и позволяя выполнять другие работы одновременно.

Однако обратите внимание, что анализатора должен использовать nextTick внутри и предлагает асинхронный API, вместо вызывающего с использованием nextTick перед вызовом анализатора.

Смежные вопросы