Как (действительно!) Сделать синхронизацию асинхронных вызовов 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 преобразует этот код в асинхронный код.