У меня есть функция load()
, внутри которой я хочу позвонить функции, скажем download()
, которые загружают xml-файл. Как только загрузка завершена, я должен вызвать функцию say parseXML()
, которая анализирует загруженный XML-файл. Как только синтаксический анализ завершен, я должен вызвать другую функцию: processParsedXMLFile()
. Можете ли вы, пожалуйста, направить меня, как я могу достичь этого самым простым способом?Асинхронное программирование в javascript
ответ
Вы можете использовать обратные вызовы
load(params , function(){
download(params, function(){
parseXML(params, function(){
processParsedXMLFile(params, function(){
...
})
})
})
})
Я бы добавил также, что обратные вызовы обычно принимают параметр результата, а иногда и два параметра (ошибка и результат), или иногда есть два обратных вызова (один для ошибки и один для успеха). Итог - ПРОЧИТАЙТЕ DOCS функции async и обратите внимание на подпись обратного вызова. – Iftah
также обратите внимание, что обычно IO-методы являются асинхронными (например, загружаемым ресурсом или ждут пользовательского события), но методы «process» и «parse» обычно синхронизируются. Снова - прочитайте документацию по функциям, которые вы используете. – Iftah
Отличный ответ. О, подождите, это 2015 год. –
два общих подхода существуют для асинхронного кода в JavaScript - обратных вызовов и обещаний.
Есть много сообщений о том, как обсуждать обратный вызов и Javascript callback after json parse показывает хороший пример с подробным объяснением.
Для обещаний: http://wiki.commonjs.org/wiki/Promises/A и https://www.promisejs.org/ являются хорошим отправным пунктом для ознакомления с обещаниями, которые чаще встречаются для написания асинхронного кода в JavaScript.
В зависимости от того, где вы бежите вам скрипт, который вы, возможно, потребуется включить пакеты/библиотеки, чтобы иметь поддержку обещаний:
- NodeJS - установить соответствующий пакет ("promise", , ...)
- WinJS - обещания коренным образом поддерживаются. Info - WinJS.Promise и руководство Asynchronous programming in JavaScript, есть также много вопросов на SO, охватывающие различные аспекты, как WinJS, return a promise from a function which may or may not be async
- Для обычных браузеров, использующих реализацию JQuery является обычной практикой - [] jQuery.promise] (http://api.jquery.com/promise/). С широкой доступности ES6 совместимых браузеров не нужны дополнительные библиотеки - MDM Promise - ES6
обещаниями будет выглядеть следующим образом (при условии, каждый из вызовов возвращает обещание, которое выполняется при завершении операции):
download()
.then(function(data){/* parse XML here */})
.then(function(data){/* process parsed XML*/ });
' скачать(). затем (ParseXML) .then (processParsedXMLFile) '. –
любая библиотека, которая будет включена? – prashanta
Возможно, не зависит от вашей среды. –