Это одно из мест, с помощью которого привязка данных, используемая во многих новых фреймворках JavaScript, будет очень полезна для вас ...
Итак, если вы используете Angular, React или любые другие фреймворки, которые делают два способа связывания данных, эта проблема просто исправлена для вас, поэтому простым языком ваш результат undefined
на первом этапе, поэтому вы получили result = undefined
до получения данных, а затем, как только вы получите результат , он будет обновляться и присваиваться новому значению, которое отвечает на ваш вызов Ajax ...
Но как вы можете сделать это в чистом javascript или jQuery, например, как вы задали этот вопрос?
Вы можете использовать обратный вызов, обещание и недавно наблюдаемое, чтобы обрабатывать его для вас, например, в обещаниях мы имеем некоторые функции, такие как success () или then (), которые будут выполняться, когда ваши данные будут готовы для вас, с функцией обратного вызова или подписки на наблюдаемые.
Например, в вашем случае, в котором вы используете jQuery, вы можете сделать что-то вроде этого:
$(document).ready(function(){
function foo() {
$.ajax({url: "api/data", success: function(data){
fooDone(data); //after we have data, we pass it to fooDone
}});
};
function fooDone(data) {
console.log(data); //fooDone has the data and console.log it
};
foo(); //call happens here
});
Для получения дополнительной информации n изучение обещаний и наблюдаемых, которые являются новыми способами для создания асинхронных материалов.
Документы Flask, используемые для описания того, как это сделать, но были удалены из-за заметок производительности ниже. Вам не нужен Tornado для обслуживания вашего приложения Flask, если весь ваш асинхронный код уже не написан в Tornado.
В этом документе также описаны торнадо о WSGI . Они также содержат большое предупреждение о том, что это, вероятно, менее эффективно, чем использование выделенного сервера приложений WSGI, такого как uWSGI, Gunicorn или mod_wsgi.
WSGI - это синхронный интерфейс , в то время как модель параллелизма Tornado основана на однопоточном асинхронном выполнении. Это означает, что запуск WSGI-приложения с помощью
blockquote>WSGIContainer
Tornado менее масштабируемый , чем запуск того же приложения на многопоточном WSGI-сервере, напримерgunicorn
илиuwsgi
. ИспользуйтеWSGIContainer
только тогда, когда есть преимущества для объединения Tornado и WSGI в том же процессе, что перевешивает уменьшенную масштабируемость.Например, вместо использования Gunicorn:
< hr>gunicorn -w 4 app:app
После всего этого, если вы действительно все еще хотите использовать Tornado, вы можете использовать шаблон, описанный в документах:
from tornado.wsgi import WSGIContainer from tornado.httpserver import HTTPServer from tornado.ioloop import IOLoop from yourapplication import app http_server = HTTPServer(WSGIContainer(app)) http_server.listen(5000) IOLoop.instance().start()