Еще один подход к возврату значения из асинхронной функции - передать объект, который сохранит результат от асинхронной функции.
Вот пример того же:
var async = require("async");
// This wires up result back to the caller
var result = {};
var asyncTasks = [];
asyncTasks.push(function(_callback){
// some asynchronous operation
$.ajax({
url: '...',
success: function(response) {
result.response = response;
_callback();
}
});
});
async.parallel(asyncTasks, function(){
// result is available after performing asynchronous operation
console.log(result)
console.log('Done');
});
Я использую объект result
для хранения значения во время асинхронной операции. Это позволяет получить результат даже после асинхронного задания.
Я использую этот подход много. Мне было бы интересно узнать, насколько хорошо этот подход работает, когда задействован результат обратно через последовательные модули.
<init-param>
и <context-param>
являются статическими параметрами, которые хранятся в файле web.xml. Если у вас есть данные, которые не меняются часто, вы можете сохранить их в одном из них.
Если вы хотите хранить определенные данные, которые ограничены определенной областью сервлета, вы можете использовать <init-param>
. Все, что вы объявляете внутри <init-param>
, доступно только для этого конкретного сервлета. Init-param объявлен внутри тега <servlet>
.
<servlet>
<display-name>HelloWorldServlet</display-name>
<servlet-name>HelloWorldServlet</servlet-name>
<init-param>
<param-name>Greetings</param-name>
<param-value>Hello</param-value>
</init-param>
</servlet>
, и вы можете получить доступ к этим параметрам в сервлет как следует:
out.println(getInitParameter("Greetings"));
Если вы хотите хранить данные, общие для всего приложения, и если он не изменяется часто, вы можете использовать <context-param>
вместо метода servletContext.setAttribute()
контекста приложения. Для получения дополнительной информации об использовании <context-param>
VS ServletContext.setAttribute()
посмотрите на этот вопрос . context-param объявляются под тегом web-app
. Вы можете объявить и получить доступ к <context-param>
следующим образом
<web-app>
<context-param>
<param-name>Country</param-name>
<param-value>India</param-value>
</context-param>
<context-param>
<param-name>Age</param-name>
<param-value>24</param-value>
</context-param>
</web-app>
Использование в приложении либо в JSP, либо в Servlet
getServletContext().getInitParameter("Country");
getServletContext().getInitParameter("Age");
<init-param>
будет использоваться, если вы хотите инициализировать некоторый параметр для определенного сервлета. Когда запрос приходит к сервлету сначала, его метод init
будет вызываться тогда doGet/doPost
, тогда как если вы хотите инициализировать некоторую переменную для всего приложения, вам нужно будет использовать <context-param>
. Каждый сервлет будет иметь доступ к контекстной переменной.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/META-INF/PersistenceContext.xml
</param-value>
</context-param>
Я инициализировал свой PersistenceContext.xml
в <context-param>
, потому что все мои сервлеты будут взаимодействовать с базой данных в рамках MVC.
Howerver,
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:ApplicationContext.xml
</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.organisation.project.rest</param-value>
</init-param>
</servlet>
в вышеупомянутый код, я настраиваю трикотаж и ApplicationContext.xml
только для слоя отдыха. Для этого я использую </init-param>
Рассмотрим приведенное ниже определение в web.xml
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>TestServlet</servlet-class>
<init-param>
<param-name>myprop</param-name>
<param-value>value</param-value>
</init-param>
</servlet>
. Вы можете видеть, что init-param определен внутри элемента сервлета. Это означает, что он доступен только сервлету под декларацией, а не другим частям веб-приложения. Если вы хотите, чтобы этот параметр был доступен для других частей приложения, скажем, JSP, это должно быть явно передано JSP. Например, передается как request.setAttribute (). Это очень неэффективно и сложно кодировать.
Итак, если вы хотите получить доступ к глобальным значениям из любого места приложения без явно переданных этих значений, вам нужно использовать параметры контекста Init.
Рассмотрим следующее определение в сети. xml
<web-app>
<context-param>
<param-name>myprop</param-name>
<param-value>value</param-value>
</context-param>
</web-app>
Этот параметр контекста доступен для всех частей веб-приложения и может быть получен из объекта Context. Например, getServletContext (). GetInitParameter («dbname»);
Из JSP вы можете получить доступ к параметру контекста с помощью неявного объекта приложения. Например, application.getAttribute ("dbname");