Как (действительно!) Сделать синхронизацию асинхронных вызовов JavaScript (в Chrome)?

Я знаю, что несколько похожих вопросов задавали раз газону, но мне действительно нужно сделать асинхронный вызов действительно синхронным. Я обычно должен использовать AMD в асинхронном режиме, и я должен убедиться, что некоторые звонки require выполнить синхронно - после выполнения переданного обратного вызова. Этого было бы достаточно, чтобы он работал на Chrome. Кажется, трюк можно сделать с ES6 yield/await, К несчастью, yield кажется требует traceur с хромом. На самом деле, я хотел бы иметь легкое, минимальное решение и избегать большого библиотечного пространства.

Какое минимальное решение для реализации этого?

1 ответ

Решение

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

Я никогда не видел ситуации, когда вам нужен синхронный код в JS. Можете ли вы привести нам пример того, почему вы чувствуете, что синхронный код необходим?

Так далеко как yield/awaitВы можете заставить свой код выглядеть синхронным, но на самом деле это "сопрограмма", что означает, что функция имеет несколько точек входа. Другими словами, это все еще асинхронно. ES6 получает генераторы и yield ключевое слово, но await находится в спецификации ES7. Не задерживай дыхание для этого.

Вы можете использовать Traceur Babel или Regenerator для передачи вашего кода для поддержки генераторов и yield, что действительно приятно. Затем вы можете использовать co, чтобы превратить вашу функцию генератора в сопрограмму. У меня есть пример этой работы в Chrome на LearnHarmony.

Вы также можете использовать import/export ключевые слова в ES6 (используя traceur или какой-либо другой транспортер / полифилл), чтобы получить то, что похоже на синхронный код: import Foo from 'foo', Но не позволяй этому обмануть тебя. Это также асинхронно. Компилятор Traceur преобразует этот код в асинхронный код.

Другие вопросы по тегам