JavaScript является однопоточным.Ничего не происходит одновременно.Однако, если fn1 является асинхронным вызовом, поток будет часто выполнять fn2 до того, как возвращаемое значение fn1 будет готово.Это то, что делает JavaScript «racy».
Если у вас есть несколько вызовов aysnc в серии, то вам нужно либо управлять серией обратных вызовов NESTED, либо создать очередь, используя шаблон Active Object.У jQuery есть один (упомянутый).Я написал библиотеку, которая делает это под названием Proto-Q: http://code.google.com/p/proto-q/