Ответ 1
Некоторые соображения:
Сначала я сделал серьезные тесты, в какой степени setImmediate работает медленнее, чем process.nextTick
. Если он не будет (намного) медленнее, я бы пошел на setImmediate
сразу, так как это не будет голодать цикл событий.
В node 0.10 есть жесткий предел (1000, см. node.js docs), сколько раз вы можете рекурсивно вызывать nextTick, поэтому вы должны чтобы это не происходило в любом случае. Вам нужно либо выбрать стратегию перед итерацией, либо изменить стратегию во время итерации (при проверке текущего количества итераций).
Если вы выберете process.nextTick по соображениям производительности, вы можете установить настраиваемый жесткий предел для того, сколько раз он выполнял бы process.nextTick
в строке, а также переключился на setImmediate
. У меня нет опыта работы с серьезными рабочими нагрузками на nodejs, но я думаю, что людям это не понравится, если ваша библиотека делает прерывистый ввод/вывод.
setImmediate, безусловно, будет безопаснее всего.
Что касается браузера:
Я не изучал вашу библиотеку, но, поскольку вы на самом деле начинаете с setTimeout
, вам может помочь узнать о новых методах задержки при помощи window.postMessage
, а что нет. Там есть красивая и маленькая библиотека под названием next-tick (но с другой семантикой, чем node next-tick!), И там cross-browser shim для setImmediate, что довольно тяжело, потому что 1) ему нужно реализовать спецификацию setImmediate (включая возможность отменить запланированные задачи) и 2) она имеет гораздо более широкую совместимость с браузером.
Просмотрите эту демонстрацию асинхронной сортировки, сравнив setImmediate (прокладка) с параметром setTimeout.