2014-10-20 4 views
1

Я знаю, что некоторые подобные вопросы были заданы временем gazillon, но мне действительно нужно сделать асинхронный вызов по-настоящему синхронным. Обычно мне приходится использовать AMD в асинхронном режиме, и я должен удостовериться, что некоторые вызовы на require выполняются синхронно - после того, как выполненный в обратном вызове выполнен. Достаточно было бы заставить его работать на хроме. Кажется, что это можно сделать с ES6 yield/await. К сожалению, , кажется, требует traceur с хромом. Фактически, я хотел бы иметь легкое, минимальное решение и избегать введения большого объема библиотеки.Как мне (действительно!) Выполнить синхронизацию асинхронного вызова JavaScript (в Chrome)?

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

+0

Есть ли какое-либо состояние (= видимо для области требуемых вызовов), которое может быть задано обратным вызовом? – raina77ow

+0

Да. Я мог бы сделать: «var whatEverIWantSetFromCallBack; require (...); // onlyProceedWhenSetByCallBack;" –

+0

Затем вы можете отложить вызов 'require', как показано в [этом ответе] (http://stackoverflow.com/a/26409908/1229023), правильно? Вам нужно будет проверить, что var вместо 'busy', и выполнить обратный вызов (поставленный в' wait') вместо решения обещания, но основная идея будет такой же. – raina77ow

ответ

3

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

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

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

Вы можете использовать Traceur Babel или Regenerator для transpile коды для поддержки генераторов и yield, что очень приятно. Затем вы можете использовать co, чтобы превратить вашу генераторную функцию в сопрограмму. У меня example of this working in chrome на LearnHarmony.

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

+0

Этот код находится на странице https://github.com/Alfresco/community-edition/blob/master/projects/slingshot/source/web/js/alfresco/core/CoreWidgetProcessing.js#L429. Комментарии выше вызова объясняют ситуацию. Виджеты строят дерево и запускают события, когда их дети инициализируются. Фактически, события не должны запускаться до того, как дочернее дерево полностью инициализировано. Сохранение отслеживания async быстро запутывается, и я не хочу исправлять файлы по всей структуре. Отключение агрегации и использование режима AMD в режиме синхронизации работает, но вы теряете информацию о исходном файле в браузере. –

+0

Можете ли вы не использовать обещания и делать что-то вроде 'Promise.all'? В любом случае подлинный синхронный код невозможен. Вам нужно архитектовать его. Обещания помогают. Итак, сопроводители/урожай, которые вы можете использовать в современных браузерах, если вы переполняете/полиполняете. –

+0

Кстати, выход/ожидание - это графики для отправки в Chrome 55 около 6 декабря 2016 года. –